【问题标题】:Remove duplicate data in a rows from data frame python without affecting the shape of the DataFrame从数据框python中删除行中的重复数据而不影响DataFrame的形状
【发布时间】:2020-06-28 20:59:38
【问题描述】:

有一个数据框:

<!-- begin snippet: js hide: false console: true babel: false -->
> ==> index   A  B
>       0     1  10
>       1     1  20
>       2     1  30 
>       3     2  10

我想从 A 列中删除重复项,但不影响数据框的形状。

结果 O/p 为

> ==> Index  A  B
>       0       10
>       1    1  20
>       2       30
>       3    2  10

如何完成这项任务。

【问题讨论】:

  • 保留行1和删除行02的逻辑是什么?
  • 它不会删除第 0 行和第 2 行,可以保留任何行。但是第 0,1,2 行的值为 1,最终输出应该删除重复值而不删除任何行。所以行 0,1,2 将代表值 1。

标签: python-3.x pandas dataframe duplicates pandas-groupby


【解决方案1】:

如下,您可以选择重复的感兴趣的行和列('A')并将值设置为NAN。

# create df

df = pd.DataFrame([
    [1, 10],
    [1, 20],
    [1, 30],
    [2, 10]],
    columns=['A', 'B'])

# replace duplicated elements with NAN, preserving the row

df.loc[df.duplicated(subset='A', keep='first'), 'A'] = np.nan

原表:


    A   B
0   1   10
1   1   20
2   1   30
3   2   10

修改表:

    A     B
0   1.0   10
1   NaN   20
2   NaN   30
3   2.0   10

列“A”成为支持 NaN 的浮点数据类型。

使用duplicated,您可以将元素的第一个 (keep='first') 或最后一个 (keep='last') 指定为原始元素 - 就像它一样 - 其他相同元素被视为重复元素。

与@Quang Hoang 的评论有关,duplicated 中没有选择任意中间元素的逻辑,如您的示例所示。

*************************** 以下响应 ****************** *********

根据您的回复,我想我明白您想要什么了。以下是非矢量化方法,只要您的数据框不大,就应该没问题。它将重复的 B 值保存到列表中(见下文)

# create sample dataframe

df = pd.DataFrame([
    [1, 10],
    [1, 20],
    [1, 30],
    [2, 10],
    [3, 15],
    [3, 20]],
    columns=['A', 'B'])

# create a dictionary where unique column A values are keys, and values are all the column B values for a given key (whether the A value is a duplicate or not)

dictionary = dict()

for value in df.A.unique():
    if len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) > 0:
        all_values = df.loc[(df.A == value) & df.A.duplicated(keep=False), 'B'].tolist()
        dictionary[value] = all_values
    elif len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) == 0:
        dictionary[value] = df.loc[(df.A == value), 'B'].tolist()

# make a new dataframe

df2 = pd.DataFrame(columns=['A', 'B'])
df2.A = list(dictionary.keys())
df2.B = list(dictionary.values())

结果是这样的:

    A    B
0   1   [10, 20, 30]
1   2   [10]
2   3   [15, 20]

如果您想删除原始数据帧以释放内存:del df

【讨论】:

  • 部分可行。感谢@David1592 的努力。 1.A列值1代表B列上的值10,20和30。如果A列替换为NAN值; A 列值 1 表示 B 列上的值 10,值 20,30 表示损失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2012-11-11
相关资源
最近更新 更多