繁体   English   中英

如果 Pandas 列不包含来自同一行中另一列的值,则将另一列中的值添加到新行中

[英]If a Pandas column doesn't contain a value from another column in the same row, then add the value from another column in a new line

我想在新行中将“A”列中的值添加到“B”列中,仅当“A”列中的相应值不包含在“B”列中时。

我的数据框:

df

  A          B
  value1     value4
  value1
  value1     value4\nvalue1\n
  value2     value4\nvalue7\n
  value2     value4\n
  value3
  value3     value4\nvalue3\nvalue6
  value3     value2\nvalue1
  value3     value3\nvalue1\nvalue6

所以,我想要的数据框

df

  A          B
  value1     value4\nvalue1
  value1     value1
  value1     value4\nvalue1
  value2     value4\nvalue7\nvalue2
  value2     value4\nvalue2
  value3     value3
  value3     value4\nvalue3\nvalue6
  value3     value2\nvalue1\nvalue3
  value3     value3\nvalue1\nvalue6

此外,问题是有时在“B”列中的字符串末尾,\\n 存在,有时不存在。

我尝试使用df.A.str.contains(df["A"]) ,但是当contains()具有数据框列时它不起作用。 我认为这样的事情可以工作: df.B.str.extract('(%s)' % '|'.join(df.A)) ,这仅适用于列“A”中的值,它们是出现在“B”列中 - 用于匹配,我不知道如何适应我的问题。

使用列表推导式创建布尔掩码。 用空字符串替换缺失值并使用Series.where

mask = [a in b for a, b in zip(df['A'], df['B'].fillna(''))]
b = df['B'].str.replace(r'\\n$', '')
df['B'] = b.where(mask, b + '\\n' + df['A']).fillna(df['A'])
print (df)
        A                       B
0  value1          value4\nvalue1
1  value1                  value1
2  value1          value4\nvalue1
3  value2  value4\nvalue7\nvalue2
4  value2          value4\nvalue2
5  value3                  value3
6  value3  value4\nvalue3\nvalue6
7  value3  value2\nvalue1\nvalue3
8  value3  value3\nvalue1\nvalue6

我建议您为此目的使用df.apply 在内部,您将能够使用lambda来创建您的条件。 同样,我使用strip()从开头和结尾删除\\n 请参阅下面的代码:

# Code to build the dataframe
import pandas as pd
d = {'A': ['value1', 'value1', 'value1', 'value2', 'value2', 'value3', 'value3', 'value3', 'value3'], 'B': ['value4', '', 'value4\nvalue1\n', 'value4\nvalue7\n', 'value4\n', '', 'value4\nvalue3\nvalue6', 'value2\nvalue1', 'value3\nvalue1\nvalue6']}
df = pd.DataFrame(data=d)

# Here is the code to use
print(df.apply(lambda x: [x["A"], (x["B"].strip()+"\n"+x["A"]).strip()] if x["A"] not in x["B"] else [x["A"], x["B"].strip()], axis=1, result_type='broadcast'))

输出:

        A                         B
0  value1            value4\nvalue1
1  value1                    value1
2  value1            value4\nvalue1
3  value2    value4\nvalue7\nvalue2
4  value2            value4\nvalue2
5  value3                    value3
6  value3    value4\nvalue3\nvalue6
7  value3    value2\nvalue1\nvalue3
8  value3    value3\nvalue1\nvalue6
8  value3    value3\nvalue1\nvalue6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM