【问题标题】:df.iterrows() if condition not working on a dataframe?df.iterrows() 如果条件不适用于数据帧?
【发布时间】:2021-11-27 21:07:46
【问题描述】:

我有数据框,如果值包含“:”,我正在尝试拆分 col1 字符串值并获取第一个元素,然后将其放入另一个 col2 中,如下所示:

df['col1'] = df['col1'].astype(str)
df['col2'] = df['col1'].astype(str)

for i, row in df.iterrows():
    if (":") in row['col1']:
      row['col2'] = row['col1'].split(":")[1]+" "+ "in Person"
      row['col1'] = 'j'

它正在处理这样的示例数据帧,但它不会改变原始数据帧中的结果--

import pandas as pd
d = {'col1': ['a:b', 'ac'], 'col2': ['z 26', 'y 25']}
df = pd.DataFrame(data=d)
print(df)

col1    col2
j       b in Person
ac      y 25

我做错了什么以及这种情况的替代方法。

【问题讨论】:

  • row 是一个新系列,而不是对原始数据框中的行的引用。
  • 来自文档DataFrame.iterrows(注 2):“您应该永远不要修改您正在迭代的内容。这不能保证在所有情况下都有效。取决于数据类型,迭代器返回一个副本而不是一个视图,写入它不会有任何效果。”
  • 当然不是。你期望它是什么?

标签: python pandas dataframe for-loop


【解决方案1】:

对于提取部分,尝试:

df['col2'] = df.col1.str.extract(r':(.+)', expand=False).add(' ').add(df.col2, fill_value='')

# Output

  col1    col2
0  a:b  b z 26
1   ac    y 25

我不确定我是否正确理解了替换,但这里是一个尝试:

df.loc[df.col1.str.contains(':'), 'col1'] = 'j'

# Output

  col1    col2
0    j  b z 26
1   ac    y 25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2020-11-27
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多