由于Redshift不支持list []数据类型,所以我在Redshift中将一些整数值存储为字符串列表(Varchar类型)。现在,为了某种分析目的,我需要将字符串列表(包含整数值)转换为一维int数组。
样本数据:
dummy_df = pd.DataFrame({'customer_id':[1,2,3],'values':[['[1]','[1,8]'],['[3,7]','[3]'],'[5]'] })
print(dummy_df)产出数据:
final_df = pd.DataFrame({'customer_id':[1,2,3],'values':[[1,1,8],[3,7,3],[5]] })
final_df注意: DataFrame dummy_df值-列是字符串的列表。
发布于 2021-01-27 17:30:05
尝试(希望能够自我解释)下面的代码:
dummy_df['values'] = (dummy_df['values'].explode() # flatten the list structure
.str.extractall('(\d+)') # extract the digits
.astype(int) # convert to int
.groupby(level=0).agg(list) # aggregate the list
)
print(dummy_df.to_dict('list'))输出:
{'customer_id': [1, 2, 3], 'values': [[1, 1, 8], [3, 7, 3], [5]]}发布于 2021-01-27 17:34:34
一种缓慢应用的方法是将这些字符串按顺序排列到列表,然后进行求和。
import ast
dummy_df['values'] = dummy_df['values'].explode().apply(ast.literal_eval).sum(level=0)
customer_id values
0 1 [1, 1, 8]
1 2 [3, 7, 3]
2 3 [5]不管怎么说,熊猫复杂的物体操作效果相当差。@QuangHoang的方法稍快一些。
import perfplot
import pandas as pd
import numpy as np
import ast
def quang(df):
return (df['values'].explode() # flatten the list structure
.str.extractall('(\d+)') # extract the digits
.astype(int) # convert to int
.groupby(level=0).agg(list))[0] # aggregate the list
def alollz(df):
return df['values'].explode().apply(ast.literal_eval).sum(level=0)
perfplot.show(
setup=lambda n: pd.concat([pd.DataFrame({'customer_id':[1,2,3],
'values':[['[1]','[1,8]'], ['[3,7]','[3]'], '[5]']})]*n,
ignore_index=True),
kernels=[
lambda df: quang(df),
lambda df: alollz(df),
],
labels=['str.extract', 'ast.literal_eval'],
n_range=[2 ** k for k in range(1, 16)],
equality_check=lambda x,y: x.compare(y).empty,
xlabel='~len(df)'
)

https://stackoverflow.com/questions/65924241
复制相似问题