【问题标题】:String length in a dataframe when they are actually lists or dictionaries当它们实际上是列表或字典时,数据框中的字符串长度
【发布时间】:2021-11-24 13:21:56
【问题描述】:

我的数据框如下所示:

    _id      answers                                               options       singleAnswer                                                     
    a       [{'title': 'dog', 'value': True},                     []            [] 
            {'title': 'cat', 'value': False}, 
            {'title': 'bird', 'value': False}]
    b       [{'title': 'food', 'value': False},                   []            [] 
            {'title': 'water', 'value': True}, 
            {'title': 'wine', 'value': False}]
    c       []                                                   [bed,          [sleep]
                                                                 chair,seat]   
    d       []                                                   [[one],[two],  [four]
                                                                 [three]]

它们显示为字典的原因是因为 BigQuery 中有一个嵌套记录,我导入它时没有取消嵌套。至于最后两列,这就是它们在初始数据集中的样子。

现在,我想构建一个额外的列,只为我提供每行单词的总长度。所以对于第一行,我会考虑dogcatbird 并获得长度10。对于最后一行,我将采用onetwothreefour 并获得长度15

如果有一个简单的字符串,我会做df['Length']=df['columnName'].str.len(),但我不能这样做,因为它给了我列表的长度。这对于字典键的长度也是有问题的,对于这些奇怪的列表列表更是如此。

是否可以按原样取出字符串长度,还是应该先将所有内容转换为我感兴趣的字符串?

【问题讨论】:

    标签: python pandas string list dataframe


    【解决方案1】:

    最直观的方法是运行一个函数,在您的列上使用apply 计算这些长度。

    更高效且坦率地说不直观的方法是首先引爆您的answers 列。然后添加到每个dict 一个_id 键对应于源dict 的键。 (或者以其他方式从一个系列中构造一个数据框,同时保留s.set_index('_id') 之后的原始系列索引。)

    从值 (pd.DataFrame(exploded.values)) 构造数据框后,获取长度 new_df['title_len'] = new_df['title'].str.len(),然后在每个 ID 组中,对这些长度求和:new_df.groupby('_id')['title_len'].sum()

    获取您的答案并将其一对一地附加到您的原始数据框中。

    【讨论】:

    • 谢谢!因此,对于最后两列,我只是将其转换为字符串并解决了问题。但是对于我尝试的“答案”专栏:parsed = df.groupby('_id').answers.apply(lambda x: pd.DataFrame(df.values[0])).reset_index() 它完全搞砸了。它一遍又一遍地用“床、椅子、座位”解析单元格,这没有任何意义。
    • df.values[0] 可能是“床、椅子、座位”
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2018-08-13
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多