我有一个记录的DataFrame,看起来像这样:
stocks = pd.Series(['A', 'A', 'B', 'C', 'C'], name = 'stock')
positions = pd.Series([ 100, 200, 300, 400, 500], name = 'positions')
same1 = pd.Series(['AA', 'AA', 'BB', 'CC', 'CC'], name = 'same1')
same2 = pd.Series(['AAA', 'AAA', 'BBB', 'CCC', 'CCC'], name = 'same2')
diff = pd.Series(['A1', 'A2', 'B3' ,'C1', 'C2'], name = 'different')
df = pd.DataFrame([stocks, same1, positions, same2, diff]).T
df
这将生成一个类似于pandas DataFrame的数据框,如下所示:
stock same1 positions same2 different
0 A AA 100 AAA A1
1 A AA 200 AAA A2
2 B BB 300 BBB B3
3 C CC 400 CCC C1
4 C CC 500 CCC C2
我对“不同”的列中的数据不感兴趣,想要对唯一的其他列进行位置求和。我目前的做法是:
df.groupby(['stock','same1','same2'])['positions'].sum()
这将会得到:
stock same1 same2
A AA AAA 300
B BB BBB 300
C CC CCC 900
Name: positions
问题是这是一个具有多索引的pd.Series。目前,我在迭代它以重新构建DataFrame。我确信我错过了一种方法。基本上,我想从DataFrame中删除1列,然后“重建”它,使得一列被求和,其余字段(相同的字段)保持不变。
如果存在空位置,此groupby方法将会出错。因此,我目前使用一个复杂的DataFrame迭代来构建一个新的DataFrame。是否有更好的方法?
df.groupby(['stock','same1','same2'], as_index=False)
,那么DataFrame将保留['stock','same1','same2']
作为列(从而完全避免了reset_index()
)。 - unutbu