Joo*_*oop 10 python dataframe pandas
我有一个记录的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
Run Code Online (Sandbox Code Playgroud)
这给出了一个看起来像的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
Run Code Online (Sandbox Code Playgroud)
我对"不同"列中的数据不感兴趣,并希望将其他列中的位置相加.我目前正在这样做:
df.groupby(['stock','same1','same2'])['positions'].sum()
Run Code Online (Sandbox Code Playgroud)
这使:
stock same1 same2
A AA AAA 300
B BB BBB 300
C CC CCC 900
Name: positions
Run Code Online (Sandbox Code Playgroud)
问题是这是一个pd.Series(带有多索引).目前我迭代它再次构建一个DataFrame.我确信我错过了一种方法.基本上我想从DataFrame中删除1列,然后"重建它",以便对一列进行求和,其余字段(相同)保持不变.
如果有空位置,则此groupby方法会中断.所以我目前在DataFrame上使用精心设计的迭代来构建一个新的迭代.有更好的方法吗?
wai*_*kuo 10
步骤1.使用[['positions']]代替['positions']:
In [30]: df2 = df.groupby(['stock','same1','same2'])[['positions']].sum()
In [31]: df2
Out[31]:
positions
stock same1 same2
A AA AAA 300
B BB BBB 300
C CC CCC 900
Run Code Online (Sandbox Code Playgroud)
步骤2.然后使用reset_index将索引移回列
In [34]: df2.reset_index()
Out[34]:
stock same1 same2 positions
0 A AA AAA 300
1 B BB BBB 300
2 C CC CCC 900
Run Code Online (Sandbox Code Playgroud)
似乎我的方法不太好.
感谢@Andy和@unutbu,您可以通过更优雅的方式实现目标:
方法1:
df.groupby(['stock', 'same1', 'same2'])['positions'].sum().reset_index()
Run Code Online (Sandbox Code Playgroud)
方法2:
df.groupby(['stock', 'same1', 'same2'], as_index=False)['positions'].sum()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9387 次 |
| 最近记录: |