【问题标题】:Select distinct names from all letters in alphabet从字母表中的所有字母中选择不同的名称
【发布时间】:2019-08-13 17:27:58
【问题描述】:

背景

我有以下示例 df:

df = pd.DataFrame({'Name' : ['ANT J DOE', 'ANT J DOE', 'ANT J DOE', 'ANT J DOE',
                             'ANDREW THE', 'AMANDA TO', 'AZARA HEBREW', 'BARNY GUM',
                             'BORIS CHE', 'BORIS CHE', 'BORIS CHE', 'BRYAN WILLI',
                             'BRAIN THEY', 'BREZ TOW', 'CRAFT CHEEZE', 'ERICE BEE',
                             'ERICK BEE', 'ERIC BRAI', 'ERIK REY', 'FER AZ',
                             'FRAY AR', 'HE SAM', 'JANE ANN DOE', 'JANE ANN DOE',
                             'JAMES J DOE', 'MART DR', 'QUE BALL', 'ZIM THE',
                             'ZIMMY SALLOW', 'ZAQ CRO'],
                   'P_ID': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
                            20,21,22,23,24,25,26,27,28,29,30]
                     })

输出

        Name     P_ID
0   ANT J DOE      1
1   ANT J DOE      2
2   ANT J DOE      3
3   ANT J DOE      4
4   ANDREW THE     5
5   AMANDA TO      6
6   AZARA HEBREW   7
7   BARNY GUM      8
8   BORIS CHE      9
9   BORIS CHE     10
10  BORIS CHE     11
11  BRYAN WILLI   12
12  BRAIN THEY    13
13  BREZ TOW      14
14  CRAFT CHEEZE  15
15  ERICE BEE     16
16  ERICK BEE     17
17  ERIC BRAI     18
18  ERIK REY      19
19  FER AZ        20
20  FRAY AR       21
21  HE SAM        22
22  JANE ANN DOE  23
23  JANE ANN DOE  24
24  JAMES J DOE   25
25  MART DR       26
26  QUE BALL      27
27  ZIM THE       28
28  ZIMMY SALLOW  29
29  ZAQ CRO       30

目标

Name 中从每个“字母组”A-Z 中选择两个不同的名称。

例子:

1) “字母组”“A”中的两个不同名称将对应于ANT J DOEANDREW THE

2) “字母组”“Z”中的两个不同名称将对应于ZIM THEZIMMY SALLOW

重要的是,Name 在此示例中并不详尽。我真正的Name 列有所有26 表示的字母表

期望的输出

        Name     P_ID
0   ANT J DOE      1
1   ANDREW THE     5
2   BARNY GUM      8
3   BORIS CHE     11
4   ERICE BEE     16
5   ERIC BRAI     18
6   FER AZ        20
7   FRAY AR       21
8   JANE ANN DOE  23
9   JAMES J DOE   25
10  ZIM THE       28
11  ZIMMY SALLOW  29

问题

如何实现我想要的输出?

【问题讨论】:

  • 是 2 还是前 2?同样是distinct names in Name from each "alphabet group", A-Z,你的意思是如果名字以那个字母开头?
  • 所以你想忽略那些没有有两个不同值的值?
  • @anky_91 任意两个name 有效。是的,这里有一些例子:a for andrewb for becky, c` for cathyy for yasmine
  • @user3483203 是的,我现在想忽略

标签: python-3.x string pandas


【解决方案1】:

这有点老套,我敢肯定还有更好的选择,但它确实有效:

> df['first'] = df['Name'].astype(str).str[0]  # add a column with first letter
> print( df.drop_duplicates('Name'). \         # select distinct names
    groupby('first'). \                        # group by first letter
    filter(lambda x: len(x) > 1). \            # with at least 2 entries
    groupby('first').head(2)[['Name', 'P_ID']] # select Name and P_ID columns
    )


            Name  P_ID
0      ANT J DOE     1
4     ANDREW THE     5
7      BARNY GUM     8
8      BORIS CHE     9
15     ERICE BEE    16
16     ERICK BEE    17
19        FER AZ    20
20       FRAY AR    21
22  JANE ANN DOE    23
24   JAMES J DOE    25
27       ZIM THE    28
28  ZIMMY SALLOW    29

【讨论】:

  • @andrew 如果我想在新列中显示以下输出,它会像 df['NewName'] = df.drop_duplicates('Name').groupby('first').filter(lambda x: len(x) > 1).groupby('first').head(2)[['Name', 'P_ID']] 那样吗?
  • 您希望将输出保存为新的数据框,而不是作为额外的列 - 将整个新表保存为列是没有意义的。例如two_distinct = df.drop_duplicates('Name').groupby... 或者,如果您不再需要未过滤的数据帧,您可以重新分配 df:df = df.drop_duplicates(...
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2021-12-18
  • 2019-11-12
  • 2018-09-18
  • 2013-10-27
  • 2017-10-13
  • 2022-06-30
  • 2020-06-11
相关资源
最近更新 更多