Pandas: DataFrame에 dict μ €μž₯ μ‹€νŒ¨

에 λ§Œλ“  2017λ…„ 10μ›” 04일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: pandas-dev/pandas

μ½”λ“œ μƒ˜ν”Œ, κ°€λŠ₯ν•œ 경우 λ³΅μ‚¬ν•˜μ—¬ λΆ™μ—¬λ„£κΈ° κ°€λŠ₯ν•œ 예

μ•„λž˜ 두 예 λͺ¨λ‘ λ™μΌν•œ 였λ₯˜λ‘œ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])

df.loc[0, 'a'] = dict(x=2)
df.iloc[0, 0] = dict(x=2)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-282-62f3ee5ff885> in <module>()
      1 # file_map.loc[file_no, 'Q_step_length'] = dict(a=1)
      2 df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])
----> 3 df.iloc[0, 0] = dict(x=2)
      4 df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)
      5 df

...\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
    177             key = com._apply_if_callable(key, self.obj)
    178         indexer = self._get_setitem_indexer(key)
--> 179         self._setitem_with_indexer(indexer, value)
    180 
    181     def _has_valid_type(self, k, axis):

...\lib\site-packages\pandas\core\indexing.py in _setitem_with_indexer(self, indexer, value)
    603 
    604             if isinstance(value, (ABCSeries, dict)):
--> 605                 value = self._align_series(indexer, Series(value))
    606 
    607             elif isinstance(value, ABCDataFrame):

...\lib\site-packages\pandas\core\indexing.py in _align_series(self, indexer, ser, multiindex_indexer)
    743             return ser.reindex(ax)._values
    744 
--> 745         raise ValueError('Incompatible indexer with Series')
    746 
    747     def _align_frame(self, indexer, df):

ValueError: Incompatible indexer with Series

이것은 μž‘λ™ν•˜μ§€λ§Œ λͺ©λ‘μ„ 데이터 ν”„λ ˆμž„μ— λ°°μΉ˜ν•©λ‹ˆλ‹€.

df[0, 'a'] = [dict(x=2)]

λ‹€μŒκ³Ό 같이 맀우 λΆ€μžμ—°μŠ€λŸ¬μš΄ ꡬ성을 μ‚¬μš©ν•˜μ—¬ 데이터 ν”„λ ˆμž„μ—μ„œ 직접 사전을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)

문제 μ„€λͺ…

데이터 ν”„λ ˆμž„μ— dictλ₯Ό μ €μž₯ν•  수 μžˆμœΌλ―€λ‘œ μœ„μ™€ 같이 할당을 μ‹œλ„ν•˜λ©΄ μ‹€νŒ¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” df.loc[...] = dict(...) κ°€ μ‘΄μž¬ν•˜λŠ” 경우 ν•΄λ‹Ή 열에 dict의 값을 ν• λ‹Ήν•˜κ³ (λ¬Έμ„œν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ?) 자체 λ¬Έμ œκ°€ μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ μ•‘μ„ΈμŠ€ν•  λ•Œ 이 λ™μž‘μ΄ μ μš©λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. 데이터 ν”„λ ˆμž„μ˜ 단일 μœ„μΉ˜

μ˜ˆμƒ 좜λ ₯

μ§€μ •λœ μœ„μΉ˜ 내뢀에 사전이 μžˆλŠ” 데이터 ν”„λ ˆμž„.

pd.show_versions() 의 좜λ ₯

μ„€μΉ˜λœ 버전

컀밋: μ—†μŒ
파이썬: 3.5.4.final.0
파이썬 λΉ„νŠΈ: 64
운영 체제: μœˆλ„μš°
OS 릴리슀: 10
기계: AMD64
ν”„λ‘œμ„Έμ„œ: Intel64 μ œν’ˆκ΅° 6 λͺ¨λΈ 58 μŠ€ν…Œν•‘ 9, μ •ν’ˆ 인텔
λ°”μ΄νŠΈ μ˜€λ”: 쑰금
LC_ALL: μ—†μŒ
λž‘: μ—†μŒ
LOCALE: μ—†μŒ.μ—†μŒ

νŒ¬λ”: 0.20.3
νŒŒμ΄ν…ŒμŠ€νŠΈ: μ—†μŒ
핍: 9.0.1
μ„€μ • 도ꡬ: 36.5.0
사이썬: 0.26
숫자: 1.13.1
사이피: 0.19.1
xarray: μ—†μŒ
μ•„μ΄νŒŒμ΄μ¬: 6.1.0
μŠ€ν•‘ν¬μŠ€: μ—†μŒ
νŒ¨ν‹°: 0.4.1
λ‚ μ§œ μœ ν‹Έλ¦¬ν‹°: 2.6.1
ν”ΌμΈ : 2017.2
블둝: μ—†μŒ
병λͺ© ν˜„μƒ: μ—†μŒ
ν…Œμ΄λΈ”: μ—†μŒ
numexpr: μ—†μŒ
κΉƒν„Έ: μ—†μŒ
λ§€νŠΈν”Œλ‘―λ¦½: 2.0.2
openpyxl: μ—†μŒ
xlrd: μ—†μŒ
xlwt: μ—†μŒ
xlsxwriter: μ—†μŒ
lxml: μ—†μŒ
bs4: μ—†μŒ
html5lib: 0.9999999
sqlalchemy: μ—†μŒ
pymysql: μ—†μŒ
psycopg2: μ—†μŒ
μ§„μž2: 2.9.6
s3fs: μ—†μŒ
pandas_gbq: μ—†μŒ
pandas_datareader: μ—†μŒ

Indexing

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

같은 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 두 가지 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

DataFrame 내에 사전을 μ €μž₯ν•˜λŠ” 것은 λ“œλ¬Έ μΌμ΄μ§€λ§Œ, νŒ¨λ„ ν‘œν˜„μ— μ ν•©ν•œ λ°©μ‹μœΌλ‘œ 데이터가 μΈλ±μ‹±λ˜λŠ” μž„μ˜μ˜ ν‚€/κ°’ μŠ€νƒ€μΌ 데이터λ₯Ό ν‘œν˜„ν•˜κ³  μ‘°μž‘ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ†Œν”„νŠΈμ›¨μ–΄κ°€ Pandasλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μœ νš¨ν•œ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μœ„μΉ˜ 기반 인덱싱이 제곡된 μ‚¬μ „μ˜ ν‚€/값을 기반으둜 열을 μ—…λ°μ΄νŠΈν•˜λŠ” λ™μž‘μ€ λ‚˜μ—κ²Œ λ†€λΌμš΄ μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 이것은 λͺ…μ‹œμ  열이 μ°Έμ‘°λ˜μ§€ μ•Šμ„ λ•Œ μ˜λ―Έκ°€ μžˆλŠ” 멋진 편의 κΈ°λŠ₯μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒμ„ μ œκ³΅ν•  λ•Œ:

df.loc[row, :] = dict(key1=value1, key2=value2)

μ‚¬μ „μ˜ ν‚€λŠ” μ—΄λ‘œ μž‘μ„±λ  수 있고 df.loc[row, key1] == value1 λŠ” μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ…μ‹œμ  μ—΄ 인덱슀λ₯Ό μ œκ³΅ν•  λ•Œ 제곡된 μ‚¬μ „μ—μ„œ λŒ€μƒ 열을 μœ μΆ”ν•˜λŠ” 것은 (μ €μ—κ²Œ) 직관적이지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λŒ€μ‹  μ œκ³΅ν•˜λŠ” 경우:

df.loc[row, col] = dict(key=value)

col 열에 전체 값을 μ €μž₯ν•˜κ³  μ‹Άκ³  사전이 μžˆλŠ” κ·ΈλŒ€λ‘œ μ‚½μž…λ˜κΈ°λ₯Ό κΈ°λŒ€ν•œλ‹€λŠ” 것을 λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ–΄μ¨Œλ“ , λ‚˜λŠ” 이것이 λ‹€μ†Œ κ΄€μš©μ μ΄μ§€ μ•Šλ‹€λŠ” @jreback 에 λ™μ˜ν•˜μ§€λ§Œ @andreas-thomik이 μ œκΈ°ν•œ μ›λž˜ λ¬Έμ œμ— κ³΅κ°ν•©λ‹ˆλ‹€. 이 ꡬ문을 μ‚¬μš©ν•˜μ—¬ 데이터 ν”„λ ˆμž„μ˜ μš”μ†Œμ— λ”•μ…”λ„ˆλ¦¬λ₯Ό μ €μž₯ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” 것이 λ‚΄κ°€ μ§λ©΄ν•œ νŠΉμ • λ¬Έμ œμ— λŒ€ν•΄ 이해가 λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·ΈλŠ” 이 μš”μ²­μ— λŒ€ν•΄ μ „μ μœΌλ‘œ ν˜Όμžκ°€ μ•„λ‹™λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

이것은 맀우 λΉ„ κ΄€μš©μ μ΄λ©° μ—¬κΈ°μ—μ„œ 거의 ν˜Όμžμž…λ‹ˆλ‹€. μ£Όμœ„μ— λͺ©λ‘/νŠœν”Œμ„ μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

In [14]: df.loc[0, 'a'] = [dict(x=2)]

In [15]: df
Out[15]: 
            a    b
0  [{'x': 2}]  NaN
1         NaN  NaN
2         NaN  NaN

같은 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 두 가지 생각을 ν–ˆμŠ΅λ‹ˆλ‹€.

DataFrame 내에 사전을 μ €μž₯ν•˜λŠ” 것은 λ“œλ¬Έ μΌμ΄μ§€λ§Œ, νŒ¨λ„ ν‘œν˜„μ— μ ν•©ν•œ λ°©μ‹μœΌλ‘œ 데이터가 μΈλ±μ‹±λ˜λŠ” μž„μ˜μ˜ ν‚€/κ°’ μŠ€νƒ€μΌ 데이터λ₯Ό ν‘œν˜„ν•˜κ³  μ‘°μž‘ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ†Œν”„νŠΈμ›¨μ–΄κ°€ Pandasλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μœ νš¨ν•œ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μœ„μΉ˜ 기반 인덱싱이 제곡된 μ‚¬μ „μ˜ ν‚€/값을 기반으둜 열을 μ—…λ°μ΄νŠΈν•˜λŠ” λ™μž‘μ€ λ‚˜μ—κ²Œ λ†€λΌμš΄ μΌμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 이것은 λͺ…μ‹œμ  열이 μ°Έμ‘°λ˜μ§€ μ•Šμ„ λ•Œ μ˜λ―Έκ°€ μžˆλŠ” 멋진 편의 κΈ°λŠ₯μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒμ„ μ œκ³΅ν•  λ•Œ:

df.loc[row, :] = dict(key1=value1, key2=value2)

μ‚¬μ „μ˜ ν‚€λŠ” μ—΄λ‘œ μž‘μ„±λ  수 있고 df.loc[row, key1] == value1 λŠ” μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ…μ‹œμ  μ—΄ 인덱슀λ₯Ό μ œκ³΅ν•  λ•Œ 제곡된 μ‚¬μ „μ—μ„œ λŒ€μƒ 열을 μœ μΆ”ν•˜λŠ” 것은 (μ €μ—κ²Œ) 직관적이지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λŒ€μ‹  μ œκ³΅ν•˜λŠ” 경우:

df.loc[row, col] = dict(key=value)

col 열에 전체 값을 μ €μž₯ν•˜κ³  μ‹Άκ³  사전이 μžˆλŠ” κ·ΈλŒ€λ‘œ μ‚½μž…λ˜κΈ°λ₯Ό κΈ°λŒ€ν•œλ‹€λŠ” 것을 λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ–΄μ¨Œλ“ , λ‚˜λŠ” 이것이 λ‹€μ†Œ κ΄€μš©μ μ΄μ§€ μ•Šλ‹€λŠ” @jreback 에 λ™μ˜ν•˜μ§€λ§Œ @andreas-thomik이 μ œκΈ°ν•œ μ›λž˜ λ¬Έμ œμ— κ³΅κ°ν•©λ‹ˆλ‹€. 이 ꡬ문을 μ‚¬μš©ν•˜μ—¬ 데이터 ν”„λ ˆμž„μ˜ μš”μ†Œμ— λ”•μ…”λ„ˆλ¦¬λ₯Ό μ €μž₯ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” 것이 λ‚΄κ°€ μ§λ©΄ν•œ νŠΉμ • λ¬Έμ œμ— λŒ€ν•΄ 이해가 λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·ΈλŠ” 이 μš”μ²­μ— λŒ€ν•΄ μ „μ μœΌλ‘œ ν˜Όμžκ°€ μ•„λ‹™λ‹ˆλ‹€.

@aaclayton 이것은 #18955와 관련이 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” dicts의 μ„€μ • 슀칼라λ₯Ό 더 잘 지원할 수/μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€(및 기타 반볡 κ°€λŠ₯). 쑰금 κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰