【问题标题】:Iterate over every row in pandas dataframe and multiply all row values by one of the row values in same dataframe遍历 pandas 数据帧中的每一行,并将所有行值乘以同一数据帧中的一个行值
【发布时间】:2019-08-24 05:38:37
【问题描述】:

我正在尝试规范化数据框中的行值。需要规范化的值在其列标题中包含文本“计数”。还有其他列的标题中没有“计数”一词,我希望它们保持不变。我有一个归一化值,它位于名为“归一化值”的列中。

因此,在逐行迭代中,每行的归一化值需要乘以属于标题包含单词“count”的列的每个值。这个数据框有一个我想保留的多索引,并且有很多列和行,所以我需要在不指定确切位置或名称的情况下执行此操作。

我尝试了乘法、广播、迭代、用户定义函数的变体,但无济于事。

这是我的示例数据框:

Sample Timepoint CountA CountB PercentA PercentB CountC Normalization Value
1           1       10     20     40       30       50        .1
2           1       20     10     25       35       100       .2
2           2       50     20     20       22       40        .5

这是我希望数据框在标准化计数后的样子:

Sample Timepoint CountA CountB PercentA PercentB CountC Normalization Value
1           1       1     2     40       30       5        .1
2           1       4     2     25       35       20       .2
2           2       25    10    20       22       20       .5

【问题讨论】:

  • 似乎与此非常相似:stackoverflow.com/questions/55382352/…。使用过滤器、Index.str.contains 或列表理解对列进行子集化,然后沿axis=0 相乘
  • 此解决方案似乎有效,谢谢。

标签: python pandas function dataframe iteration


【解决方案1】:

您可以使用 str.contains ,然后将 mul 结果分配回 .loc ,同样在这里,因为您需要将其分配回来, filter 将失败

s=df.columns.str.contains('Count')
df.loc[:,s]=df.loc[:,s].mul(df['Normalization Value'],0)
df
Out[238]: 
   Sample  Timepoint         ...          CountC Normalization Value
0       1          1         ...             5.0                 0.1
1       2          1         ...            20.0                 0.2
2       2          2         ...            20.0                 0.5
[3 rows x 8 columns]

【讨论】:

    【解决方案2】:

    您需要使用.filter()regex 过滤列,然后修改它们并使用.loc 将其放回主数据框。

    df.loc[:, df.filter(regex='Count*', axis=1).columns] = df.loc[:, df.filter(regex='Count*', axis=1).columns].multiply(df['Normalization'], axis='index')
    

    输出:

          Sample  Timepoint  CountA  CountB  PercentA  PercentB  CountC  Normalization
    0       1          1     1.0     2.0        40        30     5.0            0.1
    1       2          1     4.0     2.0        25        35    20.0            0.2
    2       2          2    25.0    10.0        20        22    20.0            0.5
    

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多