Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果列不存在';t在同一行中包含另一列的值,然后在新行中添加另一列的值_Python_Pandas_Dataframe_Join_Contains - Fatal编程技术网

Python 如果列不存在';t在同一行中包含另一列的值,然后在新行中添加另一列的值

Python 如果列不存在';t在同一行中包含另一列的值,然后在新行中添加另一列的值,python,pandas,dataframe,join,contains,Python,Pandas,Dataframe,Join,Contains,我想在新行中将列“A”中的值添加到列“B”中,前提是列“A”中的对应值不包含在列“B”中 我的数据帧: df 那么,我想要的数据帧 df 此外,问题是,有时列“B”中字符串的结尾\n存在,有时不存在 我试过使用df.A.str.contains(df[“A”]),但当contains()有数据帧列时,它不起作用。我认为类似的东西可以工作:df.B.str.extract(“(%s)”%'|').join(df.A)),这只适用于列“B”中存在的列“A”中的值,用于匹配,我不知道如何适应我的问题

我想在新行中将列“A”中的值添加到列“B”中,前提是列“A”中的对应值不包含在列“B”中

我的数据帧:

df

那么,我想要的数据帧

df

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

我试过使用df.A.str.contains(df[“A”]),但当contains()有数据帧列时,它不起作用。我认为类似的东西可以工作:df.B.str.extract(“(%s)”%'|').join(df.A)),这只适用于列“B”中存在的列“A”中的值,用于匹配,我不知道如何适应我的问题


我将非常感谢您的帮助。

创建具有列表理解功能的boolena掩码,并将缺少的值替换为emty字符串,然后使用:


我建议您使用
df。为此应用
。在内部,您将能够使用
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

这是一个混乱的问题。为了更好地帮助您,我们需要查看
df.head(10).To_dict()
的输出。感谢您提供此解决方案。但是添加到一个已经在结尾包含\n的字符串时会出现问题,然后我有一个空行,我不希望这样。另外,在“B”列的第三行末尾有\n,我不想这样。@jezrael汇总-我不需要\n\n(两行新行),我只需要\n(一行新行),字符串末尾没有\n。其他一切都是它应该的。@slobokv83-ya,这里不可能使用
条带
,因为它也会重新安装
n
,所以需要使用
$
来匹配最后一个值。检查编辑后的答案。@jezrael它工作得很好,非常感谢……但我想知道,为什么我总是要写“\n”而不是你的“\\n”?然后它就可以工作了,如果我把你写的“\\n”和“\n”。@slobokv83-我想我用的是windows,所以需要通过
'\\'
转义
'\\'
谢谢你的回答。我必须学习并经常在lambda函数中使用if语句,但我正在pandas中学习。啊哈,谢谢你,因为我问了30000多行。我必须切换,因为我有fillna(),replace()…@JonathanGagne-不,你错了。引擎盖下有环,所以慢一点。我检查它-
df=pd.concat([df]*1000,忽略_index=True)
9000行。@JonathanGagne-并获得
mask=[a在b中表示a,b在zip中表示b(df['a'],df['b'].fillna('')]b=df['b'].str.replace(r'\\n$,'')df['b']=b.where(mask,b+'\\n'+df['a']).fillna(df['a']))13.2ms/loop(7次运行的平均值±标准偏差,每个循环100次)%%timeit(df.apply(λx:[x[“A”],(x[“B”].strip()+“\n”+x[“A”]).strip()]如果x[“A”]不在x[“B”]中,否则[x[“A”],x[“B”.strip()],轴=1,结果_type='broadcast'))每个循环651 ms±11 ms(7次运行的平均值±标准偏差,每个循环1次)
谢谢@jezrael,你的解决方案很可靠。带理解列表的布尔掩码,我喜欢!
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
# 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