programing

항목의 길이가 다른 사전에서 데이터 프레임 작성

powerit 2023. 6. 7. 23:21
반응형

항목의 길이가 다른 사전에서 데이터 프레임 작성

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

또한 결과를 전치하거나 열 데이터 유형(부동, 정수 등)을 변경해야 할 수도 있습니다.

사용 및

  • 다음 코드는 다음을 생성합니다.listDataFrames와 함께, 에서dict고르지 못한arrays배열을 목록으로 묶는 것입니다.
    • 이것은 다음을 만드는 방법입니다.DataFramearrays길이가 같지 않습니다.
    • 동일한 길이의 경우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

반응형