我有一个看起来像这样的数据框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}
对于每一行,我想将计数乘以gau来生成一个名为w_gau
的新列。
最终,我希望df1看起来像这样:
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是字符串,而不是int
df1.dtypes
Out[24]:
cpc object
count int64
gau object
w_gau object
dtype: object
答案 0 :(得分:3)
当您在做这种愚蠢的事情时,您应该停下来并重新思考您的方法。
那是说,你要的剪刀在这里
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)
然后运行其他代码。
答案 1 :(得分:2)
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}]})
答案 2 :(得分:1)
将列表乘以整数时,将重现该列表。因此,您可以通过将gau
中的元素转换为列表来找到自己的方式:
df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))
请注意,尽管将列表存储到pandas数据框中很少是一个好主意,但您可能要考虑采用其他方法。
编辑:
如果您有格式不正确的系列,则可以在literal_eval
库中使用ast
函数。并不是说这会浪费时间和精力,所以请尽量避免这种情况。
from ast import literal_eval
df['gau'] = df['gau'].apply(literal_eval)
df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))