我有一個資料集。
date a b c d
2021-07-01 1234 1111 123 x
2021-07-02 3456 3000 456 x
2021-07-03 5643 5142 501 x
2021-07-01 500 200 300 y
2021-07-03 1256 756 500 y
2021-07-01 1000 780 220 z
2021-07-02 3200 3000 200 z
2021-07-03 2345 2300 45 z
2021-07-04 2000 1700 300 z
資料集中有 3 家不同的公司。a:總銷售額,b:凈銷售額,c:獎金銷售額,d:公司名稱
我創建了一個公司 x (df_x) 的資料框。我想將其他公司(y 和 z)的 a、b、c 特征作為新特征添加到新資料集(df_x)中。但是,我想添加與 df_x 的日期列匹配的記錄。如果存在不匹配的日期,則分配零。
date a_x b_x c_x a_y b_y c_y a_z b_z c_z
2021-07-01 1234 1111 123 500 200 300 1000 780 220
2021-07-02 3456 3000 456 0 0 0 3200 3000 200
2021-07-03 5643 5142 501 1256 756 500 2000 1700 300
我嘗試這樣做:我創建了其他公司的資料集(df_y,df_z)
df_x = df_x.merge(df_y, on='Date', how='left', suffixes=['_x', '_y']).fillna(0)
df_x = df_x.merge(df_z, on='Date', how='left', suffixes=['', '_z']).fillna(0)
但它不起作用。此代碼復制了列。我的主要資料集(實際作業資料集)中也有 9 家公司。
我怎么解決這個問題?
uj5u.com熱心網友回復:
使用DataFrame.set_indexwith DataFrame.unstack,然后對第二級進行排序MultiIndex并最后將其展平:
df = df.set_index(['date','d']).unstack(fill_value=0).sort_index(level=1, axis=1)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
print (df)
a_x b_x c_x a_y b_y c_y a_z b_z c_z
date
2021-07-01 1234 1111 123 500 200 300 1000 780 220
2021-07-02 3456 3000 456 0 0 0 3200 3000 200
2021-07-03 5643 5142 501 1256 756 500 2345 2300 45
2021-07-04 0 0 0 0 0 0 2000 1700 300
或者DataFrame.pivot解決辦法:
df = df.pivot('date','d').fillna(0).sort_index(level=1, axis=1)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
print (df)
a_x b_x c_x a_y b_y c_y a_z b_z c_z
date
2021-07-01 1234.0 1111.0 123.0 500.0 200.0 300.0 1000.0 780.0 220.0
2021-07-02 3456.0 3000.0 456.0 0.0 0.0 0.0 3200.0 3000.0 200.0
2021-07-03 5643.0 5142.0 501.0 1256.0 756.0 500.0 2345.0 2300.0 45.0
2021-07-04 0.0 0.0 0.0 0.0 0.0 0.0 2000.0 1700.0 300.0
如果得到:
“ValueError:索引包含重復條目,無法重塑”
有重復項,需要指定聚合函式,例如。了這里mean在DataFrame.pivot_table:
print (df)
date a b c d
0 2021-07-01 1234 1111 123 x <- duplicates 2021-07-01, x
1 2021-07-01 1234 222 100 x <- duplicates 2021-07-01, x
2 2021-07-02 3456 3000 456 x
3 2021-07-03 5643 5142 501 x
4 2021-07-01 500 200 300 y
5 2021-07-03 1256 756 500 y
6 2021-07-01 1000 780 220 z
7 2021-07-02 3200 3000 200 z
8 2021-07-03 2345 2300 45 z
9 2021-07-04 2000 1700 300 z
df = df.pivot_table(index='date',columns='d', aggfunc='mean', fill_value=0).sort_index(level=1, axis=1)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
print (df)
a_x b_x c_x a_y b_y c_y a_z b_z c_z
date
2021-07-01 1234 666.5 111.5 500 200 300 1000 780 220 <- 666.5, 111.5 is mean
2021-07-02 3456 3000.0 456.0 0 0 0 3200 3000 200
2021-07-03 5643 5142.0 501.0 1256 756 500 2345 2300 45
2021-07-04 0 0.0 0.0 0 0 0 2000 1700 300
uj5u.com熱心網友回復:
您可以使用pivot或pivot_table:
out = df.pivot('date', 'd', ['a', 'b', 'c']) \
.sort_index(level=1, axis=1).fillna(0).astype(int)
out.columns = out.columns.to_flat_index().str.join('_')
# OR (to merge duplicate entries)
out = df.pivot_table(['a', 'b', 'c'], 'date', 'd', aggfunc='mean') \
.sort_index(level=1, axis=1).fillna(0).astype(int)
out.columns = out.columns.to_flat_index().str.join('_')
您可以替換'mean'為'sum','min'(最低值),'max'(最高值),'first'(找到的第一個值),'last'(找到的最后一個值)或任何自定義函式。
輸出:
>>> out.reset_index()
date a_x b_x c_x a_y b_y c_y a_z b_z c_z
0 2021-07-01 1234 1111 123 500 200 300 1000 780 220
1 2021-07-02 3456 3000 456 0 0 0 3200 3000 200
2 2021-07-03 5643 5142 501 1256 756 500 2345 2300 45
3 2021-07-04 0 0 0 0 0 0 2000 1700 300
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360288.html
上一篇:合并僅提供5行而不是7行
