【问题标题】:pandas overwrite values in multiple columns at once based on condition of values in one column熊猫根据一列中值的条件一次覆盖多列中的值
【发布时间】:2020-05-06 14:28:55
【问题描述】:

我有这样的DataFrame:

df = pd.DataFrame(data={
    'col0': [11, 22,1, 5]
    'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
    'col2': ["foo", "foo", "foobar", "bar"],
    'col3': [True, False, True, False],
    'col4': ['elo', 'foo', 'bar', 'dupa']})

我想在 col1 中的 ":" 上拆分后获取列表的长度,然后我想覆盖长度 > 2 的值,或者不覆盖长度

理想情况下,尽可能快地排成一行。

目前,我尝试但它返回 ValueError。

df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])

编辑: col1 的条件。 EDIT2:感谢您提供的所有出色且快速的答案。惊人的! EDIT3:10^6 行的计时:

@ansev 3.2657s

@jezrael 0.8922s

@anky_91 1.9511s

【问题讨论】:

  • 条件是col2还是col1
  • 我为这个错误道歉。它是 col1。

标签: python pandas apply


【解决方案1】:

另一种方法是 Series.str.splitexpand = TrueDataFrame.countaxis=1

df.loc[df['col1'].str.split(":",expand = True).count(axis=1).gt(2),['col1','col2','col3']]=["", "", False]
print(df)
   col0 col1    col2   col3  col4
0    11               False   elo
1    22  a:a     foo  False   foo
2     1    a  foobar   True   bar
3     5               False  dupa

【讨论】:

    【解决方案2】:

    使用Series.str.count,添加1,通过Series.gt进行比较,并将列表分配给列表中的过滤列:

    df.loc[df['col1'].str.count(":").add(1).gt(2), ['col1','col2','col3']] = ["", "", False]
    print (df)
       col0 col1    col2   col3  col4
    0    11               False   elo
    1    22  a:a     foo  False   foo
    2     1    a  foobar   True   bar
    3     5               False  dupa
    

    【讨论】:

    • 这是最好的答案,因为它不存储临时拆分,但为什么不使用 gt(1) 而不是添加 1 和 gt(2)
    • @anishtain4 - 是的,同意
    【解决方案3】:

    你需要series.str.len()拆分后确定列表的长度,然后你可以比较和使用.loc[],在条件匹配的地方分配列表:

    df.loc[df['col1'].str.split(":").str.len()>2,['col1','col2','col3']]=["", "", False]
    print(df)
    

       col0 col1    col2   col3  col4
    0    11               False   elo
    1    22  a:a     foo  False   foo
    2     1    a  foobar   True   bar
    3     5               False  dupa
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-15
      • 2022-12-16
      • 2012-05-29
      • 2022-01-23
      • 2021-09-03
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多