我有一个看起来像这样的 df1:
intakeNo 1 2 3 4 5
intakeDate 3/21/1978 4/28/1979 1/11/1981 11/10/1982 12/9/1983
intakeAmt 9.3E-04 5.1E-02 2.4E-04 3.5E-02 1.1E-02
intakeSD 2.2E-02 7.7E-01 5.8E-03 1.0E+00 1.7E-01
incident F F F F F
is5 0.24209 0.20829 0.21810 0.20720 0.22137
gim 0.00000 0.00000 0.00000 0.00000 0.00000
,以及一个看起来像这样的 df2:
intakeDate 3/19/1978 5/6/1979 1/3/1981 11/9/1982 11/26/1983
intakeAmt 3.2E-02 1.9E-02 4.7E-03 2.0E-02 4.9E-03
intakeSD 9.6E-01 5.3E-01 1.4E-01 5.6E-01 9.4E-02
incident F F F F F
is5 0.23315 0.18674 0.21878 0.21105 0.23536
gim 0.00000 0.00000 0.00000 0.00000 0.00000
我使用
连接两个数据帧pandas.concat([df1, df2])
获取
intakeNo 1 2 3 4 5
intakeDate 3/21/1978 4/28/1979 1/11/1981 11/10/1982 12/9/1983
intakeAmt 9.3E-04 5.1E-02 2.4E-04 3.5E-02 1.1E-02
intakeSD 2.2E-02 7.7E-01 5.8E-03 1.0E+00 1.7E-01
incident F F F F F
is5 0.24209 0.20829 0.21810 0.20720 0.22137
gim 0.00000 0.00000 0.00000 0.00000 0.00000
intakeDate 3/19/1978 5/6/1979 1/3/1981 11/9/1982 11/26/1983
intakeAmt 3.2E-02 1.9E-02 4.7E-03 2.0E-02 4.9E-03
intakeSD 9.6E-01 5.3E-01 1.4E-01 5.6E-01 9.4E-02
incident F F F F F
is5 0.23315 0.18674 0.21878 0.21105 0.23536
gim 0.00000 0.00000 0.00000 0.00000 0.00000
现在,我想对 IntakeNo1、2、3... 的 IntakeAmt 进行平均;使用一些公式使用 IntakeSD 行中的值获取 IntakeSD 值,使用一些公式获取事件信息等。
最佳答案
这是一个XY problem ,您真的不想在行之间进行操作,因为这会使pandas
无能为力。
转置数据框并应用pd.wide_to_long
。重要的一点是您希望列具有一致的类型,例如数字、日期时间等。否则,您将无法利用 pandas
中的矢量化功能。
解决方案
df2 = df.set_index('intakeNo').T.reset_index()
df2.columns = ['intakeNo', 'intakeDate1', 'intakeAmt1', 'intakeSD1', 'incident1',
'is51', 'gim1', 'intakeDate2', 'intakeAmt2', 'intakeSD2',
'incident2', 'is52', 'gim2']
df3 = pd.wide_to_long(df2, stubnames=['intakeDate', 'intakeAmt', 'intakeSD',
'incident', 'is5', 'gim'], i='intakeNo', j='num').reset_index()
num_cols = ['intakeAmt', 'intakeSD', 'is5', 'gim']
df3[num_cols] = df3[num_cols].apply(pd.to_numeric, errors='coerce').fillna(0)
df3['intakeDate'] = pd.to_datetime(df3['intakeDate'])
结果
intakeNo num intakeDate intakeAmt intakeSD incident is5 gim
0 1 1 1978-03-21 0.00093 0.0220 F 0.24209 0.0
1 2 1 1979-04-28 0.05100 0.7700 F 0.20829 0.0
2 3 1 1981-01-11 0.00024 0.0058 F 0.21810 0.0
3 4 1 1982-11-10 0.03500 1.0000 F 0.20720 0.0
4 5 1 1983-12-09 0.01100 0.1700 F 0.22137 0.0
5 1 2 1978-03-19 0.03200 0.9600 F 0.23315 0.0
6 2 2 1979-05-06 0.01900 0.5300 F 0.18674 0.0
7 3 2 1981-01-03 0.00470 0.1400 F 0.21878 0.0
8 4 2 1982-11-09 0.02000 0.5600 F 0.21105 0.0
9 5 2 1983-11-26 0.00490 0.0940 F 0.23536 0.0
使用
通过intakeNo
计算平均值intakeAmt
:
means = df3.groupby('intakeNo')['intakeAmt'].mean()
intakeNo
1 0.016465
2 0.035000
3 0.002470
4 0.027500
5 0.007950
Name: intakeAmt, dtype: float64
说明
- 转置数据框并重命名列,将索引提升到列 同时。
- 应用带有相关
stub 名称
的pd.wide_to_long
。 - 将相关列转换为数字和日期时间。
- 根据需要对新数据帧执行
groupby
操作。
关于python - 具有相同索引的数据帧的两行之间的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140597/