我有一个看起来像这样的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
现在,我想平均摄入量为摄入量NO1,2,3 ......;使用一些公式来使用intakeSD行中的值获取intakeSD值,使用一些公式来获取事件信息等。
答案 0 :(得分:1)
这是一个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
<强>用法强>
按intakeAmt
计算平均值intakeNo
:
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
<强>解释强>
pd.wide_to_long
与相关stubnames
。groupby
次操作。