我有一个DataFrame,其中包含一列带有我想用作我的DataFrame索引的日期。该列中的日期不一定是唯一的-有时可能有重复。我希望将重复项添加为新列。唯一的日期可以仅包含NaN(或其他任何值)以用于新添加的列。
为了澄清,我将提供一个示例:
import pandas as pd
data = [
{'Date':'01-01-2020','A':0,'B':1},
{'Date':'01-01-2020','A':2,'B':3},
{'Date':'02-01-2020','A':4,'B':5},
{'Date':'02-01-2020','A':6,'B':7},
{'Date':'03-01-2020','A':8,'B':9},
]
df = pd.DataFrame(data)
这将产生:
Date A B
0 01-01-2020 0 1
1 01-01-2020 2 3
2 02-01-2020 4 5
3 02-01-2020 6 7
4 03-01-2020 8 9
我想要的是:
A B C D
Date
01-01-2020 0 1 2 3
02-01-2020 4 5 6 7
03-01-2020 8 9 NaN NaN
新添加的列的名称可以是任意的。我什至不知道追加是否是正确的解决方法。从头开始创建新的DataFrame也许更容易。
DataFrame.set_index
与一起使用,DataFrame.stack
用于透视数据,然后通过GroupBy.cumcount
和透视Series.unstack
:
df1 = df.set_index('Date').stack().reset_index(name='val')
df = df1.set_index(['Date', df1.groupby('Date').cumcount()])['val'].unstack()
print (df)
0 1 2 3
Date
01-01-2020 0.0 1.0 2.0 3.0
02-01-2020 4.0 5.0 6.0 7.0
03-01-2020 8.0 9.0 NaN NaN
如果输出值的顺序不重要:
df1 = df.melt('Date')
df = df1.set_index(['Date', df1.groupby('Date').cumcount()])['value'].unstack()
print (df)
0 1 2 3
Date
01-01-2020 0.0 2.0 1.0 3.0
02-01-2020 4.0 6.0 5.0 7.0
03-01-2020 8.0 9.0 NaN NaN
另一个想法是使用lambda函数进行重塑:
df = (df.set_index('Date')
.groupby(level=0)
.apply(lambda x: pd.Series(x.to_numpy().ravel()))
.unstack())
print (df)
0 1 2 3
Date
01-01-2020 0.0 1.0 2.0 3.0
02-01-2020 4.0 5.0 6.0 7.0
03-01-2020 8.0 9.0 NaN NaN
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句