具有相同索引

时间:2018-03-06 21:52:36

标签: python pandas dataframe

我有一个看起来像这样的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值,使用一些公式来获取事件信息等。

1 个答案:

答案 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

<强>解释

  1. 转置数据框并重命名列,将索引提升为列 在同一时间。
  2. pd.wide_to_long与相关stubnames
  3. 一起使用
  4. 将相关列转换为数字和日期时间。
  5. 根据需要对新数据框执行groupby次操作。