【问题标题】:Add +1 to each item in a comma-separated string in pandas dataframe在 pandas 数据框中以逗号分隔的字符串中的每个项目添加 +1
【发布时间】:2015-08-26 22:44:21
【问题描述】:

我有一个结构如下的熊猫数据框:

|    ID    |     Start    |    Stop    |
________________________________________
|     1    |    1,2,3,4   |  5,6,7,7   |
|     2    |    100,101   |  200,201   |

对于数据框中的每一行,我想为 Start 列中的每个值加 1。 Start 列的 dtype 是 'object'。

所需的输出如下所示:

|    ID    |     Start    |    Stop    |
________________________________________
|     1    |    2,3,4,5   |  5,6,7,7   |
|     2    |    101,102   |  200,201   |

我尝试了以下(以及以下的许多版本),但收到一条错误消息:TypeError: cannot concatenate 'str' and 'int' objects,:

 df['test'] = [str(x + 1) for x in df['Start']]

我尝试将该列转换为 int,但得到了“invalid literal for long() with base 10: '101,102':

df['test'] = [int(x) + 1 for x in df['start'].astype(int)]

我尝试使用 str.split() 将字段转换为列表,然后将每个项目转换为整数:

提前致谢!

【问题讨论】:

  • 你试过df['test'] = [str(int(x) + 1) for x in df['Start']]吗?
  • 我做到了,它抛出了同样的“long() invalid literal with base 10:...”错误。
  • 同时使用splitint 时出现什么错误?完整的错误,没有省略号。
  • Traceback(最近一次调用最后):文件“/Users/selasady/impala_scripts/testing.py”,第 21 行,在 df['test'] = [str(int(x ) + 1) for x in df['start']] ValueError: invalid literal for int() with base 10: '101,102,'

标签: python pandas


【解决方案1】:

df['Start'] 是整个系列,因此您必须对其进行迭代并然后拆分:

new_series = []
for x in df['Start']:
    value_list = []
    for y in x.rstrip(',').split(','):
        value_list.append(str(int(y) + 1))
    new_series.append(','.join(value_list))
df['test'] = new_series

【讨论】:

  • 谢谢,但我仍然收到此错误:value_list.append(str(int(y) + 1)) ValueError: invalid literal for int() with base 10: ''
  • 您是否有示例中未包含的数据?这可能是一个悬空的逗号导致''
  • 非常感谢保罗!后面有逗号。我在列上运行了 rstrip(',') ,然后运行了你的函数,它运行良好。请将此步骤添加到您的函数中,以便我可以将其标记为答案?
【解决方案2】:

通过告诉您不能连接 string 和 int 对象,您知道 x 必须是字符串。您可以通过将 x 转换为 int 再将 1 添加到它来解决此问题。所以str(x+1) 变成了str(int(x)+1)

df['test'] = [str(int(x) + 1) for x in df['Start']]

【讨论】:

  • 谢谢,我试过了,得到了,“AttributeError: 'Series' object has no attribute 'split'。”所以我添加了'str.split(',')并得到“TypeError:int()参数必须是字符串或数字,而不是'list'”
  • 如果没有 split(','),我会收到“invalid literal for int() with base 10”错误。我被难住了!
【解决方案3】:
df = pd.DataFrame({'Start' : [ [1 , 2, 3 , 4] , [100 , 101] ] , 'Stop' : [ [5 , 6 , 7 ,7] , [200,201] ] })
df.Start =  df.Start.apply(lambda x : [y + 1 for y in x ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2019-01-23
    • 2012-09-28
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多