如何分别删除每列中的所有重复项?

2024-06-17 11:54:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个数据帧中有多个列。你知道吗

有些是重复的,有些是完全空的。你知道吗

我需要删除每列中的重复项。你知道吗

dict_A = {'Firm_A': ['A', 'A', 'B','C'],'Firm_B': [], 'Firm_C': ['B', 'A', 'B','D'], 'Firm_D': ['C', 'C', 'A','D']}
df = pd.DataFrame.from_dict(dict_A, orient = 'index')
df = df.T
df

  Firm_A Firm_B Firm_C  Firm_D
0   A     None    C       C
1   A     None    A       C
2   B     None    B       A
3   C     None    D       A

期望输出:

  Firm_A Firm_B Firm_C  Firm_D
0   A     None    C       C
1   B     None    A       A
2   C     None    B       None
3  None   None    D       None

到目前为止我已经试过了删除重复项(). 你知道吗

我有大约3000列,每列有大约100个值。你知道吗


Tags: 数据fromnonedataframedfindexdictpd
3条回答

你用的是错误的数据结构。如果数据帧行中的条目彼此不相关,则df可能不是适用的数据结构。相反,对字典值进行重复数据消除:

DictA = {k: list(set(v)) for k, v in DictA.items()}

之后,如果碰巧有一些奇怪的数据帧列应用程序,可以从那里构建df。你知道吗

使用stackdf转换为series。接下来,groupby在level=1上并调用unique来构造每列的唯一值列表。最后,从unique构造一个新的df并转置

s = df.stack().groupby(level=1).unique()

Out[279]:
Firm_A       [A, B, C]
Firm_B          [None]
Firm_C    [C, A, B, D]
Firm_D          [C, A]
dtype: object


pd.DataFrame(s.tolist(), index=df.columns).T.reindex(df.index)

Out[280]:
  Firm_A Firm_B Firm_C Firm_D
0      A   None      C      C
1      B   None      A      A
2      C   None      B   None
3   None   None      D   None

这里有一种使用duplicated的方法

df.mask(df.apply(pd.Series.duplicated,0)).apply(lambda x : sorted(x,key=pd.isnull))
Out[542]: 
  Firm_A Firm_B Firm_C Firm_D
0      A   None      C      C
1      B    NaN      A      A
2      C    NaN      B    NaN
3    NaN    NaN      D    NaN

如果您想加快速度,也可以检查justify

相关问题 更多 >