【问题标题】:pandas dataframe update column values based on other columns of the corresponding row熊猫数据框根据相应行的其他列更新列值
【发布时间】:2017-03-11 20:21:26
【问题描述】:

我有一个熊猫 dataframe 作为:

Name    abc_1   abc_2   abc_3   abc_4   abc_5   abc_6   cde_1   cde_2   cde_3   cde_4   cde_5   cde_6
 xyz    True    True    False   False   False   True    True    True    False   False   False   False
 stu    False   False   False   False   False   False   False   False   False   False   False   True
 vwx    False   True    False   False   False   False   True    True    False   False   False   False

对于给定的 row,如果对应的 cde 列为 True,则任何 abc_x 列都应更新为 True AND 至少对应行的abc列之一是True

结果:vwx 行的 abc_1 变为 Truestuabc_6行保持 False 如下:

Name    abc_1   abc_2   abc_3   abc_4   abc_5   abc_6   cde_1   cde_2   cde_3   cde_4   cde_5   cde_6
 xyz    True    True    False   False   False   False   True    True    False   False   False   False
 stu    False   False   False   False   False   False   False   False   False   False   False   True
 vwx    True    True    False   False   False   False   True    True    False   False   False   False

似乎,使用 iterrows 然后通过迭代每一列是选项。但我有几个非常大的 dataframes 并且正在寻找一种 Python 的方式来做到这一点。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    abc = df.filter(like='abc')
    cde = df.filter(like='cde')
    
    df.update((abc | cde.values).__and__(abc.any(1), 0))
    df
    

    【讨论】:

      【解决方案2】:

      您可以考虑将列转换为多索引,然后对 abccde 列执行元素明智的操作:

      df.set_index('Name', inplace=True)
      df.columns = df.columns.str.split("_", expand = True)
      df['abc'] = (df['abc'] | df['cde']).apply(lambda col: col & df['abc'].any(axis=1))
      

      如果您愿意,可以在之后将多索引加入一级列:

      df.columns = ["_".join(col) for col in df.columns]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2023-03-17
        • 2017-01-14
        • 2020-10-21
        • 2019-12-09
        • 1970-01-01
        相关资源
        最近更新 更多