【问题标题】:Column of lists to column of tuples in pandas熊猫中的列表列到元组列
【发布时间】:2021-09-18 20:13:33
【问题描述】:

我一直在摸不着头脑,试图弄清楚为什么我从一列列表中创建一列元组的尝试没有像我预期的那样工作。所以,这里有一些可行的方法:

def convert(list):
    return tuple(list)

list = ['aaaa', 'aaaa', 'd33f3f', 'sdjd3i']
print(convert(list))


('aaaa', 'aaaa', 'd33f3f', 'sdjd3i')

现在,就我而言,我的数据框如下所示:

  CLOUD_STORE_ID                     CalculationId        Date
0             772  ff80818178f93bd9017bf5094e602b05  2021-09-17
1             772  ff80818178f93bd9017bf509b4f52b0a  2021-09-17
2             772  ff80818178f93bd9017bf50ccb2c2b20  2021-09-17
0             773  ff80818178f93bd9017bf510f2a12b40  2021-09-17
1             773  ff80818178f93bd9017bf514e2582b55  2021-09-17
2             773  ff80818178f93e26017bf510b2b30c0e  2021-09-17
0             900  ff80818178f93bd9017bf510791f2b39  2021-09-17
1             900  ff80818178f93bd9017bf5109db22b3b  2021-09-17
2             900  ff80818178f93bd9017bf5139e9a2b4d  2021-09-17
0             777  ff80818178f93e26017bf50a780e0bec  2021-09-17

但我需要字符串列表:

CalculationID_df = CalculationID_df.groupby('CLOUD_STORE_ID').agg({ 'CalculationId': lambda x: '{}'.format(list(x))}).reset_index()

给出:

CLOUD_STORE_ID                                      CalculationId
0             486  ['ff80818178f93bd9017bf521bbfd2b6b', 'ff808181...
1             522               ['ff80818178f93e26017bf4efb6fb0bb6']
2             665  ['ff80818178f93bd9017bf4f7dda12acb', 'ff808181...
3             671  ['ff80818178f93bd9017bf51890802b5d', 'ff808181...
4             772  ['ff80818178f93bd9017bf5094e602b05', 'ff808181...

我实际上需要将元组传递给 SQL 查询,因此我需要将这些列表转换为元组。我认为上述方法可以解决问题:

def convert(list):
    return tuple(list)
CalculationID_df['Calcs'] = CalculationID_df.CalculationId.apply(convert)

但它会返回:

CLOUD_STORE_ID                                      CalculationId  \
0             486  ['ff80818178f93bd9017bf521bbfd2b6b', 'ff808181...   
1             522               ['ff80818178f93e26017bf4efb6fb0bb6']   
2             665  ['ff80818178f93bd9017bf4f7dda12acb', 'ff808181...   

                                               Calcs  
0  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ...  
1  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ...  
2  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ..

这显然不是我所期望的。

我做错了什么?

【问题讨论】:

  • tuple 聚合:df.groupby('CLOUD_STORE_ID')['CalculationId'].agg(tuple)

标签: python-3.x pandas


【解决方案1】:

问题是您的列表是一个字符串"['dasdas','dasd']",您需要先将其转换为列表,然后再将其转换为元组。

在这一行之后:

CalculationID_df = CalculationID_df.groupby('CLOUD_STORE_ID').agg({ 'CalculationId': lambda x: '{}'.format(list(x))}).reset_index()

添加此代码:

import ast
CalculationID_df.CalculationId = CalculationID_df.CalculationId.apply(lambda x: ast.literal_eval(x))

然后像以前一样将其转换为元组。

结果:

【讨论】:

    【解决方案2】:

    IIUC

    >>> df.groupby('CLOUD_STORE_ID')['CalculationId'] \
          .apply(tuple).astype(str).reset_index()
    
       CLOUD_STORE_ID                                      CalculationId
    0             772  ('ff80818178f93bd9017bf5094e602b05', 'ff808181...
    1             773  ('ff80818178f93bd9017bf510f2a12b40', 'ff808181...
    2             777              ('ff80818178f93e26017bf50a780e0bec',)
    3             900  ('ff80818178f93bd9017bf510791f2b39', 'ff808181...
    

    【讨论】:

    • 你好谢尔盖。直接申请tuple有问题吗?
    • 向科拉利安致敬!没有错,但我想让('ff80818178f93bd9017bf5094e602b05', 'ff80818178f..(注意'')传递给sql。 :-)
    • 完成。只需附加.astype(str)
    • 崇高!万分感谢!
    • 不客气。 Un plaisir comme d'habitude :)
    猜你喜欢
    • 2018-11-01
    • 2014-10-22
    • 2022-11-02
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多