如何有条件地转换熊猫数据框列

Posted

技术标签:

【中文标题】如何有条件地转换熊猫数据框列【英文标题】:How can I conditionally transform a pandas dataframe column 【发布时间】:2020-01-15 16:29:41 【问题描述】:

我有 2 列要循环遍历,“Volume_hedge”和“Unit_hedge”。对于每一行,如果“Unit_hedge”中的数据显示“每天数千桶”,我想除以“Volume_hedge”中的数字(与“Unit_hedge”在同一行中,等于“每天数千桶” ") 乘以 1000。

我尝试遍历枚举的两个列和之后的 if 语句。就像我说的,我为前 2 行工作,但不为其余的。

df2 = DataFrame(x)
columns_to_select = ['Volume_hedge', 'Unit_hedge']
for i, row in enumerate(columns_to_select):
    if df2['Unit_hedge'].loc[i] == 'Thousands of Barrels per Day':
        new_row = df2['Volume_hedge'].loc[i] / 1000
    else:
        none
    df2['Volume_hedge'].loc[i] = new_row
print(df2[columns_to_select].loc[0:8])

预期结果:

  Volume_hedge                    Unit_hedge
0         0.03  Thousands of Barrels per Day
1        0.024  Thousands of Barrels per Day
2        0.024  Thousands of Barrels per Day
3        0.024  Thousands of Barrels per Day
4        0.024  Thousands of Barrels per Day
5        0.024  Thousands of Barrels per Day
6        0.024  Thousands of Barrels per Day
7     32850000                   (MMBtu/Bbl)
8      4404000                   (MMBtu/Bbl)

实际结果:

 Volume_hedge                    Unit_hedge
0         0.03  Thousands of Barrels per Day
1        0.024  Thousands of Barrels per Day
2           24  Thousands of Barrels per Day
3           24  Thousands of Barrels per Day
4           24  Thousands of Barrels per Day
5           24  Thousands of Barrels per Day
6           24  Thousands of Barrels per Day
7     32850000                   (MMBtu/Bbl)
8      4404000                   (MMBtu/Bbl)

【问题讨论】:

请格式化您的代码。 【参考方案1】:

你应该在这里使用np.select

import numpy as np

df2["Volume_hedge"] = np.select(
    [df2["Unit_hedge"].eq("Thousands of Barrels per Day")], 
    [df2["Volume_hedge"].div(1000)], 
    df2["Volume_hedge"]
)

这会将Unit_hedge 等于“每天千桶”的所有行除以 1000,而其他所有行保持不变。

这还有一个优点是不用迭代完成,使用pandasnumpy时速度更快

【讨论】:

【参考方案2】:

要选择的列是一个包含两个元素的列表。当您枚举它时,i 将在 0 到 1 之间变化。这只会将该函数应用于前两行。

如果你想遍历行,你应该使用 iterrows 函数。做类似的事情,

for i, row in df2.iterrows():
    if row['Unit_hedge'] == 'Thousands of Barrels per Day':
        new_row = row['Volume_hedge'] / 1000
    df2['Volume_hedge'].iloc[i] = new_row

但是,使用 apply 而不是遍历每一行是更好的选择,因为迭代非常慢。在遍历数据框时设置列值也不是首选

【讨论】:

【参考方案3】:
df['volume_hedge'][df['Unit_hedge'] == 'Thousands of Barrels per Day'] = 
df['volume_hedge'][df['Unit_hedge'] == 'Thousands of Barrels per Day']/1000

【讨论】:

以上是关于如何有条件地转换熊猫数据框列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:考虑多种条件正确过滤数据框列

熊猫数据框列有带逗号的字符串如何将其转换为列表[关闭]

用另一个值替换熊猫数据框列中的几个值

如何将小时添加到熊猫数据框列

如何在熊猫中创建与多列相结合的数据框列

如何比较熊猫数据框列中可用的十进制数?