我有多个大数据框,需要根据特定列获取它们之间的差异,同时保留其他列的数据。 例如,如果我有以下两个数据框。
df1:
num Ref Alt DP NL
0 300 C A 50.0 30.0
1 500 C A 45.0 90.0
2 255 A C 69.0 26.0
3 450 B B 55.0 25.0
df2:
num Ref Alt DP NL
0 300 C A 71.0 88.0
1 500 A A 45.0 54.0
2 255 A A 55.0 55.0
3 450 B B 70.0 15.0
我想根据特定列['num','Ref','Alt']获得这些数据帧之间的差异,同时保持其余列['DP','NL']的数据形式。 在示例中,第2行的第0行和第3行相同(因为['num','Ref','Alt']相同),因此输出数据帧应如下所示:
df1:
num Ref Alt DP NL
0 500 C A 45.0 90.0
2 255 A C 69.0 26.0
df2:
num Ref Alt DP NL
1 500 A A 45.0 54.0
2 255 A A 55.0 55.0
或在可能的情况下将其保存在同一数据框中...
我尝试过考虑几种解决方案,一种是将它们连接起来,然后删除重复项,但是由于它们是bif数据帧,因此可能会导致问题,或者循环使用这些数据帧并使用以下脚本:
temp_df = df_list[0]
for df in df_list[1:]:
df_filtered_for_diff = pd.merge(temp_df, df, on=['num', 'Ref', 'Alt'], how='outer')
temp_df = df_filtered_for_diff
return (temp_df)
但是我想知道是否有更好的解决方案?
答案 0 :(得分:1)
您可以连接,然后使用keep=False
删除重复项:
df = pd.concat([df1, df2])\
.drop_duplicates(subset=['num', 'Ref', 'Alt'], keep=False)
print(df)
num Ref Alt DP NL
1 500 C A 45.0 90.0
2 255 A C 69.0 26.0
1 500 A A 45.0 54.0
2 255 A A 55.0 55.0
答案 1 :(得分:0)
下面的代码段为您提供了所需的输出:
import pandas as pd
df1 = pd.DataFrame([{"num": 300, "Ref": "C", "Alt": "A", "DP": 50.0, "NL": 30.0},
{"num": 500, "Ref": "C", "Alt": "A", "DP": 45.0, "NL": 90.0},
{"num": 255, "Ref": "A", "Alt": "C", "DP": 69.0, "NL": 26.0},
{"num": 450, "Ref": "B", "Alt": "B", "DP": 55.0, "NL": 25.0}])
df2 = pd.DataFrame([{"num": 300, "Ref": "C", "Alt": "A", "DP": 71.0, "NL": 88.0},
{"num": 500, "Ref": "A", "Alt": "A", "DP": 45.0, "NL": 54.0},
{"num": 255, "Ref": "A", "Alt": "A", "DP": 55.0, "NL": 55.0},
{"num": 450, "Ref": "B", "Alt": "B", "DP": 70.0, "NL": 15.0},])
print(df2[~df2.isin(df1)[["num", "Ref", "Alt"]].all(1)])
输出:
Alt DP NL Ref num
1 A 45.0 54.0 A 500
2 A 55.0 55.0 A 255
print(df1[~df1.isin(df2)[["num", "Ref", "Alt"]].all(1)])
输出:
Alt DP NL Ref num
1 A 45.0 90.0 C 500
2 C 69.0 26.0 A 255
如果要在单个数据帧中输出。您可以连接数据框并根据特定的列删除重复的行。