【问题标题】:Split string from a preset list of strings from pandas df column从 pandas df 列的预设字符串列表中拆分字符串
【发布时间】:2019-04-22 12:41:39
【问题描述】:

我有一个如下所示的 pandas 数据框。它有大约一百万行。

name = ['Jake','Matt', 'Henry']

0   A        
1 Jake Hill
2 Matt Dawn
3 Matt King
4 White Henry
5 Hyde Jake

我想遍历列表和 df['A'] 列并只返回名字。例如,最终的数据框应如下所示。

0   A
1  Jake
2  Matt
3  Matt
4  Henry
5  Jake

提前致谢。我是 python 新手,所以仍在寻找最简单的方法来做到这一点。

【问题讨论】:

  • 如果列表中不存在A列的值怎么办?
  • 不是 Jake,Matt,Henry 的名字怎么办?你想过滤掉它们吗?
  • 那么应该保留原名。例如,如果名称是 Dave Atkins,那么它应该保留名称 Dave Atkins,但我已确保我拥有所有名称。所以这应该不是问题。

标签: python python-3.x pandas python-2.7


【解决方案1】:

这是实现此目的的一种方法:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White', 'Jake Hyde']})

df['B'] = df['A'].str.split().apply(lambda x: x[0] if x[0] in first_name else ' '.join(x))

你会得到:

             A      B
0    Jake Hill   Jake
1    Matt Dawn   Matt
2    Matt King   Matt
3  Henry White  Henry
4    Jake Hyde   Jake

【讨论】:

  • 嘿格格斯。这特别采用拆分后的第一个字符串,但如果您必须从列行中提取特定字符串,则它不起作用。我稍微编辑了这个问题。请看一看。
【解决方案2】:

你需要:

first_name = ['Jake','Matt', 'Henry']

df = pd.DataFrame({'A': ['Jake Hill', 'Matt Dawn', 'Matt King', 'Henry White','Jake Hyde','Dwayne John']})

def func(x):
    for k in first_name:
        if k in x:
            return k 
    return x

df['A'] = df['A'].apply(lambda x: func(x))

输出:

            A
0           Jake
1           Matt
2           Matt
3          Henry
4           Jake
5    Dwayne John

【讨论】:

  • 嘿。这特别采用拆分后的第一个字符串,但如果您必须从列行中提取特定字符串,则它不起作用。我稍微编辑了这个问题。请看一看。
【解决方案3】:
name = ['Jake','Matt', 'Henry']
df = pd.read_csv("file.csv")

#filling nan values in-case if it is there
df.fillna(0, inplace = True)
df["First Name"] = df.A.apply(lambda x: list(set(x.split(" ")) & set(name))[0]  if x != 0 else "Not Found")

输出:

             A First Name
0    Jake Hill       Jake
1    Matt Dawn       Matt
2    Matt King       Matt
3  Henry White      Henry
4    Hyde Jake       Jake

【讨论】:

  • 嘿奇拉格。这特别采用拆分后的第一个字符串,但如果您必须从列行中提取特定字符串,则它不起作用。我稍微编辑了这个问题。请看一看。
【解决方案4】:

除了之前的编辑,我现在明白你想要替换,这可以通过列表理解来完成,如下所示,拆分列 A Fist 并选择它的第一个索引并使用 @ 传递给 lambda 987654322@方法。

数据帧结构:

df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde

你的name Var..

$ name
['Jake', 'Matt', 'Henry']

您最终想要的数据集:

参数n可用于限制输出中的分割数。

df['A'] = df['A'].str.split(n=1, expand=True)[0].apply(lambda x: x if x in name else ' '.join(x))

   print(df)
           A
    0   Jake
    1   Matt
    2   Matt
    3  Henry
    4   Jake

如果您不按从 Var 中取名字而最终目标是从数据框中获取名字,这应该很简单:

>>> df
             A
0    Jake Hill
1    Matt Dawn
2    Matt King
3  Henry White
4    Jake Hyde


>>> df['A'].str.split(n=1, expand=True)[0]
0     Jake
1     Matt
2     Matt
3    Henry
4     Jake
Name: 0, dtype: object

或者如果您想就地替换列 A ..

df['A'] = df['A'].str.split(n=1, expand=True)[0]

【讨论】:

  • 您的输入 df 与用户输入不同。在这个问题中,名字是自定义的。
  • @MohamedThasinah,感谢您的反馈,但没有得到您的反馈,但意图是一样的。
  • 在第三个索引的输入df中,用户提供为White Henry,但您将其视为Henry White
【解决方案5】:

您有一个要匹配的名称列表,以及一系列要检查的名称。在此处使用带有str.extract 的正则表达式。

df.A.str.extract(r'({})'.format('|'.join(name)))

       0
0   Jake
1   Matt
2   Matt
3  Henry
4   Jake

【讨论】:

    【解决方案6】:

    尝试使用:

    A_final=A[0].str.split(' ',expand=True, n=1).str.get(0) A_final[0] ,你的问题就解决了。

    【讨论】:

    • 这是在做什么?
    【解决方案7】:

    此方法不会被包含其中一个名字字符串的姓氏所欺骗,例如“Matten”或“Jakes”,并且如果名字和姓氏都在名字列表中,则会将它们组合起来,例如“Matt Henry”(在输出数据框中显示“MattHenry”)。

    # split the name strings into columns as new dataframe
    df1 = df.A.str.split(' ', expand=True)
    # Keep the first names in the new dataframe and fill the rest with
    # empty strings, then sum the df1 column string values to make a new array
    names_result = np.where(df1.isin(name), df1, '').sum(axis=1)
    # find the array indexes where no first names were found
    no_match_idx = np.where(names_result == '')[0]
    # fill the no first name index locations with original dataframe values
    names_result[no_match_idx] = df.A.values[no_match_idx]
    # make a dataframe using the results
    df_out = pd.DataFrame(names_result, columns=['A'])
    
    # to find names with a first and last name that are both found in the
    # first names list:
    # df_out['dups'] = df1.isin(name).sum(axis=1) > 1
    

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 2019-07-27
      • 2021-05-26
      • 2016-03-23
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多