在我的数据框中,我有一个列,其项目是包含字符串的列表。有三个可用字符串,但每个列表可以包含每个字符串中的零个或多个。
我的目标是创建三列,每列包含一个绝对数字或百分比。
import pd
import collections
df[["C1", "C2", "C3"]] = df.apply(lambda x: pd.Series(x.D).value_counts(), axis=1)
我使用了df[["C1", "C2", "C3"]] = df.apply(lambda x: pd.Series(collections.Counter(x.D)), axis=1)
,但收到以下错误:ValueError: Columns must be same length as key
答案 0 :(得分:0)
我希望我理解你正在努力做的事情,
假设您感兴趣的字符串在数组strings
中,并且包含字符串数组的数据框的列是D
,那么此代码应该可以解决这个问题
strings=['C1','C2','C3']
output_df=pd.DataFrame([])
for s in strings:
output_df[s]=input_df['D'].apply(lambda arr:len([item for item in arr if item==s]))
如果您想将新列附加到旧数据框,只需对输入和输出使用相同的DataFrame
答案 1 :(得分:0)
听起来你可以在生成数据帧之前轻松解决这个问题。如果您有三个列表,每个列表包含三个字符串的可变数量。那么怎么样呢:
import pandas as pd
possible_strings = ('C1', 'C2', 'C3')
list_1 = ['C1', 'C1', 'C2', 'C3']
list_2 = ['C2']
list_3 = ['C3', 'C3']
lists = [list_1, list_2, list_3]
list_of_series = []
for x in range(len(lists)):
vals = []
for s in possible_strings:
vals.append(lists[x].count(s))
list_of_series.append(pd.Series(vals))
df = pd.concat(list_of_series, axis=1)
这会创建您想要的数据框。