我想将PandasDataFrame
的多个列合并为单个列的列表,这样每个列表不包含重复的值,也不包含空值。
因此,例如,在下面的数据框中,将A
、B
和C
列合并为D
列:
A B C D
0 "KFC" NaN "KFC" ["KFC"]
1 NaN "Mandai Zoo" "Singapore Zoo" ["Mandai Zoo", "Singapore Zoo"]
2 "Tampines Mall" NaN NaN ["Tampines Mall"]
我能想到的最好的办法就是把这个和这个结合起来:
df['D'] = df[['A', 'B', 'C']].values.tolist()
df['D'] = df['D'].map(set).tolist()
会得到这样的结果:
A B C D
0 "KFC" NaN "KFC" ["KFC", NaN]
1 NaN "Mandai Zoo" "Singapore Zoo" [NaN, "Mandai Zoo", "Singapore Zoo"]
2 "Tampines Mall" NaN NaN ["Tampines Mall", NaN]
但这仍然使NaN
值留在列表中。
您可以在使用pd.Series.unique
之前先使用pd.dropna
df['D'] = df.apply(lambda row: row.dropna().unique(), axis=1)
print(df)
A B C D
0 KFC NaN KFC [KFC]
1 NaN Mandai Zoo Singapore Zoo [Mandai Zoo, Singapore Zoo]
2 Tampines Mall NaN NaN [Tampines Mall]
使用说明:
df[['Name', 'Year', 'Date']].apply(lambda x: [y for y in set(x) if pd.notna(y)], axis=1)
只保存非nan
s的值。
由于两个NaN
值不相等,您可以使用[x for x in my_list if x==x]
来删除NaN
值:
df = pd.DataFrame({'A': ["KFC", np.nan, "Tampines Mall"], 'B': [np.nan, "Mandai Zoo", np.nan], 'C': ["KFC", "Singapore Zoo", np.nan]}).
df.assign(D = lambda df: [[z for z in x if z==z] for x in [set(l) for l in df.values.tolist()]])
结果:
A B C D
0 KFC NaN KFC [KFC]
1 NaN Mandai Zoo Singapore Zoo [Mandai Zoo, Singapore Zoo]
2 Tampines Mall NaN NaN [Tampines Mall]