【问题标题】:Take first numeric value from string array in pandas dataframe从熊猫数据框中的字符串数组中获取第一个数值
【发布时间】:2021-12-24 08:45:29
【问题描述】:

我的 pandas 数据框中的列采用以下格式,例如:

df['X']:

0      [0.8242424242424241, 1.511111111111111, 2.9191...
1      [1.236363636363636, 2.438383838383838, 3.09090...
2                [1.064646464646464, 2.5757575757575752]
3      [0.583838383838383, 1.373737373737373, 2.02626...
4      [0.7898989898989891, 1.751515151515151, 2.6444...
                             ...                        
135    [1.236363636363636, 1.751515151515151, 2.26666...
136    [1.202020202020202, 2.1292929292929292, 2.7818...
137    [0.583838383838383, 1.476767676767676, 3.15959...
138    [1.236363636363636, 2.61010101010101, 3.090909...
139    [1.339393939393939, 2.7818181818181813, 3.1252...
Name: X, Length: 140, dtype: object

其中df['X'][0] 例如是一个完整的字符串数组,如下所示:

'[0.8242424242424241, 1.511111111111111, 2.919191919191919]'

基本上每个条目都是一个数组/向量,并且作为一个整体是一个字符串(请注意,不仅仅是单个数值是字符串,而是整个数组)

我希望能够只获取字符串向量/数组中的第一个数值并将其放置在 pandas 列的单元格中(代替字符串数组) - 我该怎么做?

【问题讨论】:

  • 你是如何创建这个数据框的?我敢打赌有一种方法可以完全避免这样做
  • 从后端服务器中的文件读取
  • 好的,但是如何你是怎么做到的?原始文件是什么样的?你甚至不应该处于这种情况

标签: python arrays pandas string dataframe


【解决方案1】:

使用pd.eval

df['X'] = pd.eval(df['X'])
# Setup: df = pd.DataFrame({'X': ['[0, 1, 2]', '[3, 4, 5]']})
>>> df
           X
0  [0, 1, 2]
1  [3, 4, 5]

# Before pd.eval
>>> df['X'][0]
'[0, 1, 2]'

>>> type(df['X'][0])
str

# After pd.eval
>>> df['X'][0]
[0, 1, 2]

>>> type(df['X'][0])
list

【讨论】:

    【解决方案2】:

    要将列表 (str_lst) 的每个字符串表示形式转换为列表,您应该使用 ast.literal_eval。然后你只需要索引每个列表的第一个元素,即ast.literal_eval(str_lst)

    要将此逻辑应用于“X”列的每个str_lst,您可以使用Series.map

    import ast 
    
    df['X'] = df['X'].map(lambda str_lst: ast.literal_eval(str_lst)[0])
    

    【讨论】:

      【解决方案3】:
      import ast
      df['a'].apply(ast.literal_eval).str[0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2019-04-14
        • 2021-08-31
        • 2017-07-01
        • 2013-12-02
        相关资源
        最近更新 更多