Python 3.x 将包含集合的dataframe列的每一行转换为包含列表的列
我有一个数据帧df1,看起来像这样:Python 3.x 将包含集合的dataframe列的每一行转换为包含列表的列,python-3.x,pandas,Python 3.x,Pandas,我有一个数据帧df1,看起来像这样: cpc count gau F21S41/32 5 {2875} F21S41/147 21 {2875} F21S41/692 20 {2875} B60Q1/0041 15 {2683, 2875, 2844} F21S43/40 15 {2875} F21S41/435 14 {2875} cpc count gau
cpc count gau
F21S41/32 5 {2875}
F21S41/147 21 {2875}
F21S41/692 20 {2875}
B60Q1/0041 15 {2683, 2875, 2844}
F21S43/40 15 {2875}
F21S41/435 14 {2875}
cpc count gau w_gau
F21S41/32 5 {2875} ['2875', '2875', '2875', '2875', '2875']
F21S41/147 3 {2875} ['2875', '2875', '2875']
F21S41/692 2 {2875} ['2875', '2875']
B60Q1/0041 2 {2683, 2875, 2844} ['2683', '2875', '2844', '2683', '2875', '2844', '2683', '2875', '2844']
F21S43/40 3 {2875} ['2875', '2875', '2875']
F21S41/435 4 {2875} ['2875', '2875', '2875', '2875']
对于每一行,我想将计数乘以gau,生成一个名为w_gau
的新列
最后,我希望df1看起来像这样:
cpc count gau
F21S41/32 5 {2875}
F21S41/147 21 {2875}
F21S41/692 20 {2875}
B60Q1/0041 15 {2683, 2875, 2844}
F21S43/40 15 {2875}
F21S41/435 14 {2875}
cpc count gau w_gau
F21S41/32 5 {2875} ['2875', '2875', '2875', '2875', '2875']
F21S41/147 3 {2875} ['2875', '2875', '2875']
F21S41/692 2 {2875} ['2875', '2875']
B60Q1/0041 2 {2683, 2875, 2844} ['2683', '2875', '2844', '2683', '2875', '2844', '2683', '2875', '2844']
F21S43/40 3 {2875} ['2875', '2875', '2875']
F21S41/435 4 {2875} ['2875', '2875', '2875', '2875']
我已经有了将列表展平为单个列表并计算每个字符串出现次数的代码
我的问题是如何将df1中的gau
转换为可以乘以整数的列表列表
我试过:
In [16]: df1.gau.tolist()
但这会将列中的所有内容转换为单个列表。我需要每一行包含一个列表,其中每个字符串或int都是列表中的一个字符串
编辑:gau是字符串,而不是整数
df1.dtypes
Out[24]:
cpc object
count int64
gau object
w_gau object
dtype: object
当你做这种愚蠢的事情时,你应该停下来重新思考你的方法 也就是说,你要的剪刀在这里
df['gau'].apply(list) * df['count']
作为一个新专栏
df.assign(w_gau=df['gau'].apply(list) * df['count'])
如果您的
gau
列是字符串,请运行此命令将其转换为集合
from ast import literal_eval
df['gau'] = df['gau'].apply(literal_eval)
然后运行其他代码。IIUC
df['New']=[list(x)*y for x, y in zip(df['gau'],df['Count'])]
df
Out[628]:
Count gau New
0 1 {1} [1]
1 2 {1, 2, 3} [1, 2, 3, 1, 2, 3]
数据输入
df=pd.DataFrame({'Count':[1,2],'gau':[{1},{1,2,3}]})
当你将一个列表乘以一个整数时,你会重新生成它。因此,您可以通过将
gau
中的元素转换为列表来找到您的方法:
df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))
注意,将列表存储到大熊猫数据文件中很少是个好主意,但是,您可能需要考虑其他方式。
编辑: 如果序列格式不正确,可以使用ast
库中的literal\u eval
函数。但这并不是说这会耗费时间和精力,所以要尽可能避免这些情况
from ast import literal_eval
df['gau'] = df['gau'].apply(literal_eval)
df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))
没错,我需要一种更好的减肥方法,但这就是我目前的减肥方法。也就是说,当我尝试你的解决方案时,我没有得到我想要的答案。['{', '2', '6', '8', '3', ',', ' ', '2', '8', '7', '5', ',', ' ', '2', '8', '4', '4', '}', '{', '2', '6', '8', '3', ',', ' ', '2', '8', '7', '5', ',', ' ', '2', '8', '4', '4', '}', '{', '2', '6', '8', '3', ',', ' ', '2', '8', '7', '5', ',', ' ', '2', '8', '4', '4', '}', '{', '2', '6', '8', '3', ',', ' ', '2', '8',..., '}']这意味着您的项目是字符串。查看我的更新。应该会清理干净的,很好。谢谢,Gau包含字符串not,int,所以这不起作用。我编辑了这些问题以反映这一点。谢谢我编辑了我的答案,添加了一行帮助您事先转换
gau
列中的值。我忽略了提到gau的类型是string而不是int。我更新了问题。感谢you@Britt这将是同样的事情:-)这实际上不起作用。df5.New的第一行如下所示:['{',2',8',7',5','}','{',2',8',7',5','}','}',''}']