簡體   English   中英

將數據框列轉換為字典

[英]Convert data frame columns to dictionary

我有大型Pandas數據框,看起來像這樣:

  Label1 Label2 Label3   Id1  Val1   Id2  Val2   Id3  Val3
0      A      B      C     a  0.80     b  0.79     c  0.29
1      A      B      D  None   NaN  None   NaN     e  0.06
2      E      B      F  None   NaN     b  0.86  None   NaN
3      E      G      H     b  0.16  None   NaN     f  0.34

我想將Id1之前的列轉換為字典,如下所示:

  Label1 Label2 Label3                               kvp
0      A      B      C  {'a': 0.8, 'b': 0.79, 'c': 0.29}
1      A      B      D                       {'e': 0.06}
2      E      B      F                       {'b': 0.86}
3      E      G      H            {'b': 0.16, 'f': 0.34}

是否存在用於此類選擇和轉換的Pandas習慣用法,還是我必須編寫代碼來遍歷行?

您可以通過獲取相關列來為單行創建字典,將它們重新整理為2列numpy數組,然后將其轉換為dict:

>>> a
  Label1 Label2 Label3   Id1  Val1   Id2  Val2   Id3  Val3
0      A      B      C     a  0.80     b  0.79     c  0.29
1      A      B      D  None   NaN  None   NaN     e  0.06
2      E      B      F  None   NaN     b  0.86  None   NaN
3      E      G      H     b  0.16  None   NaN     f  0.34

>>> a.irow(0)[3:].reshape(3,2)
array([['a', 0.80000000000000004],
       ['b', 0.79000000000000004],
       ['c', 0.28999999999999998]], dtype=object)
>>> dict(_)
{'b': 0.79000000000000004, 'c': 0.28999999999999998, 'a': 0.80000000000000004}

您可以編寫一個使用該原則的函數來創建舊行的新行:

def adjust_row(row):
    kvp_data = row[3:].valid()
    kvp_data = kvp_data.reshape(kvp_data.size//2, 2)
    kvp = dict(kvp_data)
    return row[:3].append(pd.Series({'kvp': kvp}))

請注意,這會通過調用valid()來排除None s和NaN ,並計算臨時numpy數組的適當行數。 驗證它對任何給定行都是正確的:

>>> adjust_row(a.irow(1))
Label1              A
Label2              B
Label3              D
kvp       {'e': 0.06}
dtype: object

完成后,可以使用數據幀上的apply方法將其應用於每一行:

>>> a.apply(adjust_row, axis=1)
  Label1 Label2 Label3                               kvp
0      A      B      C  {'b': 0.79, 'c': 0.29, 'a': 0.8}
1      A      B      D                       {'e': 0.06}
2      E      B      F                       {'b': 0.86}
3      E      G      H            {'f': 0.34, 'b': 0.16}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM