我已将数据加载到数据帧中,但无法弄清楚如何将已解析的数据与另一列进行比较,并仅返回匹配项。
这似乎应该很容易,但是我看不到。我试图将这些值分开进行比较,但这就是我遇到的问题。
import pandas as pd
df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})
df['col1_split'] = df['col1'].str.split(';')
df['col2_split'] = df['col2'].str.split(';')
# output something like...
df['output'] = [null,';c1312;',';d1310;']
我希望看到类似-
第一行-返回空值,因为t9010
中不包含col2_split
第二行-返回c1312
中的col2_split
第三行-返回d1310
但不返回c1512
,因为d1310
中只有col2_split
最后,最终文本应以分号分隔并以分号开头和结尾,即;t9010;
或;c1312;
或;d1310;c1512;
(如果有多个分号)。
答案 0 :(得分:2)
您尝试使用“;”分割的部分是正确的。之后,您需要将col1_split
中的每个元素与col2_split
中的每个元素进行比较。您可以编写一个简单的函数来避免多次循环,并使用pandas
apply
函数完成其余工作
这是相同代码的示例代码
import pandas as pd
df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})
df['col1_split'] = df['col1'].str.split(';')
df['col2_split'] = df['col2'].str.split(';')
def value_check(list1, list2):
string = ""
for i in list1:
if (i in list2) & (len(i)>0):
string += ";"+i+';'
return string
df['output'] = df.apply(lambda x: value_check(x.col1_split, x.col2_split), axis=1)
df
输出
答案 1 :(得分:0)
如果其值位于col1
中,则可以尝试使用此方法获取col2
中的所有值。该方法是通过将每行中的字符串值拆分为一个列表,然后首先在列表值([]
)中忽略空值或长度小于0的字符串。然后在与col1
匹配的col2
中搜索没有空值的值,并将输出显示到output
列。
df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})
#splitting & omitting the empty values
df['col1_split']=df.col1.apply(lambda x: list((pd.Series(x.split(';')))[(pd.Series(x.split(';'))).apply(len)>0]))
df['col2_split']=df.col2.apply(lambda x: list((pd.Series(x.split(';')))[(pd.Series(x.split(';'))).apply(len)>0]))
def check(list1, list2):
res=''
for i in list1:
if (i in list2): res += ';'+str(i)
#semicolon cover at the end of string in each row
if len(res)>0: res+=';'
return res
df['output']=df.apply(lambda x: check(x.col1_split, x.col2_split), axis=1)
df
输出:
希望这可以为您提供帮助。
答案 2 :(得分:-1)
为此,我们可以使用嵌套的list
理解:
df['common'] = pd.Series([[sub for sub in left if sub in right] for left, right in zip(df['col1_split'], df['col2_split'])]).str.join(';')
print(df['common'])
输出:
0 ;
1 ;c1312;
2 ;d1310;
Name: common, dtype: object