所以通过使用
df_ab = pd.concat([df_a, df_b], axis=1, join='inner')
Run Code Online (Sandbox Code Playgroud)
我得到一个这样的Dataframe:
A A B B
0 5 5 10 10
1 6 6 19 19
Run Code Online (Sandbox Code Playgroud)
我想删除它的多个列:
A B
0 5 10
1 6 19
Run Code Online (Sandbox Code Playgroud)
因为df_a和df_b是同一个Dataframe的子集,所以我知道如果列名相同,所有行都具有相同的值.我有一个有效的解决方案:
df_ab = df_ab.T.drop_duplicates().T
Run Code Online (Sandbox Code Playgroud)
但是我有很多行,所以这个很慢.有人有更快的解决方案吗?我更喜欢一种不需要明确知道列名的解决方案.
Pra*_*iel 18
最简单的方法是:
df = df.loc[:,~df.columns.duplicated()]
Run Code Online (Sandbox Code Playgroud)
一行代码可以改变一切
unu*_*tbu 11
也许你最好完全避免这个问题,使用pd.merge
代替pd.concat
:
df_ab = pd.merge(df_a, df_b, how='inner')
Run Code Online (Sandbox Code Playgroud)
这将合并df_a
,并df_b
在所有列在共同分享。
您可以使用np.unique
来获取唯一列的索引,然后使用.iloc
:
>>> df
A A B B
0 5 5 10 10
1 6 6 19 19
>>> _, i = np.unique(df.columns, return_index=True)
>>> df.iloc[:, i]
A B
0 5 10
1 6 19
Run Code Online (Sandbox Code Playgroud)
对于那些跳过问题直接看答案的人,对我来说最简单的方法是使用 OP 的解决方案(假设您没有遇到他所做的相同的性能问题:转置数据帧,使用 drop_duplicates,然后再次转置它:
df.T.drop_duplicates().T
Run Code Online (Sandbox Code Playgroud)