如何计算Pandas中单个列中的项目?

时间:2015-08-14 16:56:57

标签: python pandas

在我的数据框中,我有一个列,其项目是包含字符串的列表。有三个可用字符串,但每个列表可以包含每个字符串中的零个或多个。

我的目标是创建三列,每列包含一个绝对数字或百分比。

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

2 个答案:

答案 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)

这会创建您想要的数据框。