[英]How to convert data frame with dictionary columns into multi level data frame
[英]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.