使用DataFrame列作为索引,并将重复项追加为新列



我有一个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_indexDataFrame.stack来取消透视数据,然后通过GroupBy.cumcountSeries.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

最新更新