【问题标题】:Formatting strings in a dataframe格式化数据框中的字符串
【发布时间】:2021-09-29 05:24:44
【问题描述】:

我有一个数据框

Name
Joe Smith
Jane Doe
Homer Simpson

我正在尝试将其格式化为

Name
Smith, Joe
Doe, Jane
Simpson, Homer

我有这个代码,它适用于我列表中约 80% 的用户,但有些用户没有正确使用。

invalid_users = ['Test User', 'Test User2', 'Test User3']


for index, row in df_Users.iterrows():
    gap_pos = df_Users["Name"][index].find(" ") 
    if gap_pos > 0 and row["Name"] not in invalid_users:
        row["Name"] = df_Users["Name"][index][len(df_Users["Name"][index])-gap_pos+1:].strip() +', ' + df_Users["Name"][index][:gap_pos]

未正确通过的用户,通常他们的姓在某处被截断 - 即 Simpson ==> mpson

我在这里做错了什么?

【问题讨论】:

  • 如果你仍然想要这个循环,请改用split"Joe Smith".split(" ")会给你一个类似['Joe', 'Smith']的列表
  • 为什么是[len(df_Users["Name"][index])-gap_pos+1:]?一个简单的[gap_pos+1:] 应该可以(但最好还是使用上述替代方法之一)。

标签: python pandas string dataframe


【解决方案1】:

只需在空间上拆分,然后将其反转(这就是 .str[::-1] 正在做的事情)并加入 ,

>>> df['Name'].str.split(' ').str[::-1].str.join(', ')
0        Smith, Joe
1         Doe, Jane
2    Simpson, Homer
Name: Name, dtype: object

如果您的数据中包含Jr. Joe Smith 之类的名称,那么您可以按照以下方式进行操作:

df['Name'].str.split(' ').str[::-1].apply(lambda x:(x[0],' '.join(x[1:]))).str.join(', ')

【讨论】:

  • 你的名字和姓氏颠倒了
  • 是的,但你没有把姓放在第一位。
  • 我更喜欢这个答案,但值得指出的是,“Jill St. John”会变成“John, St., Jill”,这是不希望的。不过,我认为这给出了正确的骨架。这取决于他的数据是什么样的。
  • 是的先生,你是对的@TimRoberts,这取决于数据。
【解决方案2】:

我不确定你想用len 做什么,但这是不对的。你只想直接从gap_pos开始:

row["Name"] = df_Users["Name"][index][gap_pos+1:].strip() +', ' + df_Users["Name"][index][:gap_pos]

我很想为此使用split

【讨论】:

    【解决方案3】:

    Pandas 是一个利用矢量运算的库,特别是对于简单的转换和大多数 DataFrame 操作。

    根据您的示例,这是一个可行的代码:

    import pandas as pd
    
    df = pd.DataFrame({"name": ["Joe Smith", "Jane Doe", "Homer Simpson"]})
    # df
    #              name
    # 0       Joe Smith
    # 1        Jane Doe
    # 2   Homer Simpson
    
    df["name"] = df["name"].apply(lambda x: f"{x.split(' ')[1]}, {x.split(' ')[0]}")
    # df
    #               name
    # 0       Smith, Joe
    # 1        Doe, Jane
    # 2   Simpson, Homer 
    

    apply 函数获取每一行并将指定的函数应用于每一行。 在这里,指定的函数是一个lambda 函数,假设名称模式是“FirstName LastName”,它会执行您想要的操作。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2019-10-13
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多