[英]Pandas: pivot_table
假設我有這樣一個數據幀:
data = [
{'column1': 'asd', 'column2': 'a', 'column3': 'mileage', 'column4': 7889, 'column5': None},
{'column1': 'fsd', 'column2': 'a', 'column3': 'temp', 'column4': 4557, 'column5': None},
{'column1': None, 'column2': 'a', 'column3': 'string', 'column4': None, 'column5': 'value_string1'},
{'column1': 'asd', 'column2': 'b', 'column3': 'mileage', 'column4': 5678, 'column5': None},
{'column1': 'fsd', 'column2': 'b', 'column3': 'temp', 'column4': 5830, 'column5': None},
{'column1': None, 'column2': 'b', 'column3': 'string', 'column4': None, 'column5': 'value_string2'},
{'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 10, 'column5': None},
{'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 8, 'column5': None},
]
df = pd.DataFrame(data)
column1 column2 column3 column4 column5
0 asd a mileage 7889.0 None
1 fsd a temp 4557.0 None
2 None a string NaN value_string1
3 asd b mileage 5678.0 None
4 fsd b temp 5830.0 None
5 None b string NaN value_string2
6 None c temp 10.0 None
7 None c temp 8.0 None
我想將此 dataframe 轉換為:
column2 mileage temp_1 temp_2
a 7889.0 4557.0 NaN
b 5678.0 5830.0 NaN
c NaN 10.0 NaN
c NaN Nan 8.0
我嘗試使用 pandas function “數據透視表”
pivot_table = df.pivot_table(index='column2', columns='column3', values='column4')
但結果是
column3 mileage temp
column2
a 7889.0 4557.0
b 5678.0 5830.0
c NaN 9.0
所以這個 function 組合了第 2 列中的相等值,但如果它們在第 3 列中也具有相同的值,則第 4 列中的值將是原始表中值的平均值。
有什么辦法可以修改這個function得到我想要的結果嗎? 或者還有另一種方法嗎?
這不完全是你想要的,但看看:
>>> (df.loc[df['column4'].notna(), ['column2', 'column3', 'column4']]
.assign(index=lambda x: x.groupby('column3').cumcount())
.pivot_table(index=['index', 'column2'], columns='column3', values='column4')
.reset_index('column2').rename_axis(index=None, columns=None))
column2 mileage temp
0 a 7889.0 4557.0
1 b 5678.0 5830.0
2 c NaN 10.0
3 c NaN 8.0
與@Corralien 類似的解決方案,措辭略有不同:
# create a counter for duplicate values of column2 and column3
df['cumcount'] = df.groupby(['column2', 'column3']).cumcount()
# adding pivot table
df.pivot_table(index=['column2','cumcount'],
columns='column3',
values='column4',
aggfunc={'column4':['first']})
first
column3 mileage temp
column2 cumcount
a 0 7889.0 4557.0
b 0 5678.0 5830.0
c 0 NaN 10.0
1 NaN 8.0
前兩列是一個復合索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.