항목의 길이가 다른 사전에서 데이터 프레임 작성
10개의 키-값 쌍이 있는 사전이 있다고 가정해 보겠습니다.각 항목에는 숫자 배열이 들어 있습니다.그러나 배열의 길이가 모든 배열에 대해 동일하지는 않습니다.
각 열에 다른 항목이 있는 데이터 프레임을 만들려면 어떻게 해야 합니까?
시도할 때:
pd.DataFrame(my_dict)
이해합니다.
ValueError: arrays must all be the same length
이것을 극복할 방법이 있습니까?판다를 사용하게 되어 기쁩니다.NaN
더 짧은 항목을 위해 해당 열을 패딩합니다.
Python 3.x의 경우:
import pandas as pd
import numpy as np
d = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) )
pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.items() ]))
Out[7]:
A B
0 1 1
1 2 2
2 NaN 3
3 NaN 4
Python 2.x의 경우:
교체하다d.items()
와 함께d.iteritems()
.
이를 위한 간단한 방법은 다음과 같습니다.
In[20]: my_dict = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) )
In[21]: df = pd.DataFrame.from_dict(my_dict, orient='index')
In[22]: df
Out[22]:
0 1 2 3
A 1 2 NaN NaN
B 1 2 3 4
In[23]: df.transpose()
Out[23]:
A B
0 1 1
1 2 2
2 NaN 3
3 NaN 4
구문을 정리하면서도 다른 답변과 기본적으로 동일한 작업을 수행하는 방법은 다음과 같습니다.
>>> mydict = {'one': [1,2,3], 2: [4,5,6,7], 3: 8}
>>> dict_df = pd.DataFrame({ key:pd.Series(value) for key, value in mydict.items() })
>>> dict_df
one 2 3
0 1.0 4 8.0
1 2.0 5 NaN
2 3.0 6 NaN
3 NaN 7 NaN
목록에도 유사한 구문이 있습니다.
>>> mylist = [ [1,2,3], [4,5], 6 ]
>>> list_df = pd.DataFrame([ pd.Series(value) for value in mylist ])
>>> list_df
0 1 2
0 1.0 2.0 3.0
1 4.0 5.0 NaN
2 6.0 NaN NaN
목록의 다른 구문은 다음과 같습니다.
>>> mylist = [ [1,2,3], [4,5], 6 ]
>>> list_df = pd.DataFrame({ i:pd.Series(value) for i, value in enumerate(mylist) })
>>> list_df
0 1 2
0 1 4.0 6.0
1 2 5.0 NaN
2 3 NaN NaN
또한 결과를 전치하거나 열 데이터 유형(부동, 정수 등)을 변경해야 할 수도 있습니다.
사용 및
- 다음 코드는 다음을 생성합니다.
list
의DataFrames
와 함께, 에서dict
고르지 못한arrays
배열을 목록으로 묶는 것입니다.- 이것은 다음을 만드는 방법입니다.
DataFrame
의arrays
길이가 같지 않습니다. - 동일한 길이의 경우
arrays
,사용하다df = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3})
- 이것은 다음을 만드는 방법입니다.
import pandas as pd
import numpy as np
# create the uneven arrays
mu, sigma = 200, 25
np.random.seed(365)
x1 = mu + sigma * np.random.randn(10, 1)
x2 = mu + sigma * np.random.randn(15, 1)
x3 = mu + sigma * np.random.randn(20, 1)
data = {'x1': x1, 'x2': x2, 'x3': x3}
# create the dataframe
df = pd.concat([pd.DataFrame(v, columns=[k]) for k, v in data.items()], axis=1)
사용 및
- 길이가 일정하지 않은 반복성의 경우,
zip_longest
결측값을 다음 값으로 채웁니다.fillvalue
. - ZIP 제너레이터의 포장을 풀어야 합니다. 왜냐하면
DataFrame
시공자가 포장을 풀지 않습니다.
from itertools import zip_longest
# zip all the values together
zl = list(zip_longest(*data.values()))
# create dataframe
df = pd.DataFrame(zl, columns=data.keys())
줄거리.
df.plot(marker='o', figsize=[10, 5])
데이터 프레임
x1 x2 x3
0 232.06900 235.92577 173.19476
1 176.94349 209.26802 186.09590
2 194.18474 168.36006 194.36712
3 196.55705 238.79899 218.33316
4 249.25695 167.91326 191.62559
5 215.25377 214.85430 230.95119
6 232.68784 240.30358 196.72593
7 212.43409 201.15896 187.96484
8 188.97014 187.59007 164.78436
9 196.82937 252.67682 196.47132
10 NaN 223.32571 208.43823
11 NaN 209.50658 209.83761
12 NaN 215.27461 249.06087
13 NaN 210.52486 158.65781
14 NaN 193.53504 199.10456
15 NaN NaN 186.19700
16 NaN NaN 223.02479
17 NaN NaN 185.68525
18 NaN NaN 213.41414
19 NaN NaN 271.75376
이것이 OP의 질문에 직접적으로 대답하지는 않지만요.어레이가 동일하지 않을 때 이 솔루션이 탁월한 솔루션이라는 것을 알게 되었고, 다음과 같은 사항을 공유하고자 합니다.
In [31]: d = {'one' : Series([1., 2., 3.], index=['a', 'b', 'c']),
....: 'two' : Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
....:
In [32]: df = DataFrame(d)
In [33]: df
Out[33]:
one two
a 1 1
b 2 2
c 3 3
d NaN 4
사용할 수도 있습니다.pd.concat
따라axis=1
의 목록과 함께pd.Series
객체:
import pandas as pd, numpy as np
d = {'A': np.array([1,2]), 'B': np.array([1,2,3,4])}
res = pd.concat([pd.Series(v, name=k) for k, v in d.items()], axis=1)
print(res)
A B
0 1.0 1
1 2.0 2
2 NaN 3
3 NaN 4
다음 두 라인 모두 완벽하게 작동합니다.
pd.DataFrame.from_dict(df, orient='index').transpose() #A
pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in df.items() ])) #B (Better)
그러나 주피터에서 %time it을 사용하면 B 대 A의 속도 비율이 4배가 되는데, 이는 특히 대용량 데이터 세트(주로 많은 열/기능)로 작업할 때 매우 인상적입니다.
당신이 보여주기를 원하지 않는다면.NaN
그리고 두 개의 특정 길이를 가지며, 남은 각 셀에 '공간'을 추가하는 것도 효과적일 것입니다.
import pandas
long = [6, 4, 7, 3]
short = [5, 6]
for n in range(len(long) - len(short)):
short.append(' ')
df = pd.DataFrame({'A':long, 'B':short}]
# Make sure Excel file exists in the working directory
datatoexcel = pd.ExcelWriter('example1.xlsx',engine = 'xlsxwriter')
df.to_excel(datatoexcel,sheet_name = 'Sheet1')
datatoexcel.save()
A B
0 6 5
1 4 6
2 7
3 3
두 개 이상의 길이의 항목이 있는 경우 유사한 방법을 사용하는 함수를 만드는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/19736080/creating-dataframe-from-a-dictionary-where-entries-have-different-lengths
'programing' 카테고리의 다른 글
사용자가 제출한 파일의 압축을 푸는 보안 (0) | 2023.06.07 |
---|---|
선택 변경에 대한 응답으로 일부 vuex 데이터를 필터링하는 방법 (0) | 2023.06.07 |
Argparse 인수에 대한 특정 값 허용 (0) | 2023.06.07 |
Node.js - Mongoose와 관계 만들기 (0) | 2023.06.07 |
wp 정의되지 않은 함수 add_infined_section (0) | 2023.06.07 |