python - 具有相同索引的数据帧的两行之间的操作

标签 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   

现在,我想对 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

说明

  1. 转置数据框并重命名列,将索引提升到列 同时。
  2. 应用带有相关 stub 名称pd.wide_to_long
  3. 将相关列转换为数字和日期时间。
  4. 根据需要对新数据帧执行 groupby 操作。

关于python - 具有相同索引的数据帧的两行之间的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140597/

相关文章:

Python:打印不起作用,脚本无休止地挂起

python - 用 Python 和 Numpy 计算协方差

python - 将列项转换为自己的列python

python - 如何加快数据框搜索和赋值?

python - NearDuplicatesDetection 0.2.0 安装期间出错

python - 如何更改 matplotlib 中误差线限制的标记符号?

python - 按特定顺序移动 pandas 数据框中的行

Python Pandas - 更快地迭代数据中的类别同时删除异常值的方法(没有 For 循环)

reshape 没有 “timevar” 的数据帧和多个值列从长格式到宽格式

python - 不要删除 groupby 上不存在的索引 - Pandas