【问题标题】:Merging two identically-named columns in a dataframe合并数据框中的两个同名列
【发布时间】:2021-12-28 15:23:29
【问题描述】:

我有一个如下所示的数据框:

df = pd.DataFrame({'a':[1,0,1],'b':[0,1,0],'b1':[1,0,0],'c':[0,1,1]})
df.columns = ['a','b','b','c']

>>> df
   a  b  b  c
0  1  0  1  0
1  0  1  0  1
2  1  0  0  1

我想将这两个不同的b 列合并在一起,如下所示:

   a  b  c
0  1  1  0
1  0  1  1
2  1  0  1

我知道我可以在按位上下文中使用 | (OR) 来组合它们,例如与a 和c:

>>> df['a'] | df['c']
0    1
1    1
2    1
dtype: int64

但我无法选择两个单独的 b 列,因为:

>>> df['b']
   b  b
0  0  1
1  1  0
2  0  0

>>> df['b']['b']
   b  b
0  0  1
1  1  0
2  0  0

>>> df['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']['b']
   b  b
0  0  1
1  1  0
2  0  0

【问题讨论】:

  • 你应该为“join”指定一些规则(它实际上不是一个join)。在这种情况下,我从数据中解释您的列仅包含 0 或 1,并且 1 覆盖了 0。就这些了吗?
  • 是的@Ric。我希望b 以1,1,0 结尾,因为这两个b 是0,1,0 和1,0,0。
  • df["b"].sum(axis=1).clip(0, 1)?或df["b"].apply(lambda x: x[0]|x[1], axis=1)
  • df.T.drop_duplicates().T 如果你想删除额外的 B 列
  • 很好@Chris - 这也很有用。我确实想放弃多余的。

标签: python pandas merge


【解决方案1】:

假设您有多组重复列,您可以使用DataFrame.groupby 将not_speshal's solution 的相同逻辑应用于每个组。

# group the columns (axis=1) by their labels (level=0) and apply the logic to each group
df = df.groupby(level=0, axis=1).sum().clip(0, 1) 

【讨论】:

    【解决方案2】:

    除了建议的答案by not_speshal,您还可以通过索引访问列,如下所示:

    df.iloc[:, 1] | df.iloc[:, 2]
    

    【讨论】:

      【解决方案3】:

      试试sum 和clip:

      df["b"] = df["b"].sum(axis=1).clip(0, 1)
      
      #remove duplicate column
      df = df.loc[:, ~df.columns.duplicated()]
      

      【讨论】:

      • 调用clip 似乎没有必要。
      • 如果两个“b”列都有1,你会得到2而不是1
      • @HarryPlotter - 如果有多个重复的列,这将是有意义的。否则我的方法要快得多(每个循环 28.5 ns ± 1.04 ns 与每个循环 2.55 ms ± 112 µs)。使用更大的 DataFrame(大 1000 倍:每循环 30.3 ns ± 0.809 ns vs 每循环 3.41 ms ± 206 µs),我的代码也变得更加高效。
      • 是的,自然会慢一些。但在这种情况下,OP 想要概括不同列组的逻辑。
      • 我想我实际上会使用你的@HarryPlotter,因为虽然我喜欢 not_speshal 这个快速的小解决方案,但重复的列将是任意的,所以你的列对于我的特殊情况会更好。你能把它放在答案中吗?
      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 2019-11-20
      • 2021-01-16
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多