如何使用第一列的值作為其他列的標題來擴展一組列?
例如:
x = pd.DataFrame({'id':[11,998,3923], 'count':[7,7,7],
'attributes':['VIS,TEMP,MIN','MIN,VIS,TEMP','MIN,VIS'],
'attribute_values':['0,4,2','2,3,0','0,9'],
'attribute_years':['2000,2001,2002','2001,2002,2003','2008,2009']})
(編輯:請注意,屬性可能亂序或丟失。)
| 指數 | ID | 數數 | 屬性 | 屬性值 | 屬性年 |
|---|---|---|---|---|---|
| 0 | 11 | 7 | 可見度、溫度、最小值 | 0,4,2 | 2000,2001,2002 |
| 1 | 998 | 7 | 最小值、可見度、溫度 | 2,3,0 | 2001,2002,2003 |
| 2 | 3923 | 7 | 最小可見度 | 0,9 | 2008,2009 |
在這種情況下,attributes應該使用列值來創建具有attribute_values和列的新attribute_years列。
理想輸出:
| 指數 | ID | 數數 | 屬性值VIS | 屬性值TEMP | 屬性值最小值 | 屬性_年_VIS | 屬性_年_TEMP | 屬性_年_MIN |
|---|---|---|---|---|---|---|---|---|
| 0 | 11 | 7 | 0 | 4 | 2 | 2000 | 2001年 | 2002年 |
| 1 | 998 | 7 | 3 | 0 | 2 | 2002年 | 2003年 | 2001年 |
| 2 | 3923 | 7 | 9 | 鈉 | 0 | 2009 | 鈉 | 2008年 |
uj5u.com熱心網友回復:
解決方案
拆分屬性中的字串,如分隔符周圍的列,以轉換為串列,然后explode將串列轉換為單獨的行,然后pivot使用 columns=attributes重塑,最后使用扁平化多索引map join
y = x.set_index(['id', 'count'])
y = y.apply(lambda s: s.str.split(',')).explode([*y])
y = y.pivot(columns='attributes')
y.columns = y.columns.map('_'.join)
y = y.reset_index()
>>> y
id count attribute_values_MIN attribute_values_TEMP attribute_values_VIS attribute_years_MIN attribute_years_TEMP attribute_years_VIS
0 11 7 2 4 0 2002 2001 2000
1 998 7 2 0 3 2001 2003 2002
2 3923 7 0 NaN 9 2008 NaN 2009
uj5u.com熱心網友回復:
我猜 pandas 中沒有用于拆分字串并從中創建新列的本機函式。但是,您可以輕松撰寫自己的小函式。假設你的例子
import pandas as pd
x = pd.DataFrame({'id': [1,2,3],
'attributes': ['VIS,TEMP,MIN','MIN,VIS,TEMP','MIN,VIS'],
'attribute_values': ['0,4,2','2,3,0','0,9'],
'attribute_years': ['2000,2001,2002','2001,2002,2003','2008,2009']})
您可以回圈遍歷行,拆分列中的字串x['attributes'],x['attribute_values']和x['attribute_years'],拆分字串(始終假設我們不需要擔心不同的長度并','指示要拆分字串的字符)并創建一個新字典。使用新的鍵值對收集所有字典,您可以構建一個新的 pandas.DataFrame 并根據需要將其分配給原始字典:
data = []
for i, row in x.iterrows():
# extract data
att = row['attributes'].split(',')
val = list(map(int, row['attribute_values'].split(',')))
yrs = list(map(int, row['attribute_years'].split(',')))
# create new dictionaries
row_new = {f'attribute_values_{a}': v for a, v in zip(att, val)}
row_new.update({f'attribute_years_{a}': y for a, y in zip(att, yrs)})
# concatenate dictionaries and append to list
data.append(row_new)
# create table from list of rows
pd.DataFrame(data, index=x.index)
輸出:
| 屬性值VIS | 屬性值TEMP | 屬性值最小值 | 屬性_年_VIS | 屬性_年_TEMP | 屬性_年_MIN |
|---|---|---|---|---|---|
| 0 | 0 | 4.0 | 2 | 2000 | 2001.0 |
| 1 | 3 | 0.0 | 2 | 2002年 | 2003.0 |
| 2 | 9 | 鈉 | 0 | 2009 | 鈉 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478505.html
上一篇:如何使用不同的變數來計算新變數,具體取決于哪個變數有缺失值?
下一篇:根據函式中的值計數創建虛擬變數
