在pandas中动态创建计数表

时间:2017-11-24 13:01:02

标签: python-3.x pandas

我想从行数据创建一个计数表,其中的条目由制表符分隔。例如,

listView1.Items.Clear();
listView1.Items.Add("item");

我期望的输出如下表所示:

Input text file:

   L1 A  A  B  A  C  D
   L2 B  B  D  E  E
   L3 F  G

这是我想到的算法:

  1. 使用col标题创建pandas数据框['A','B'..'G']
  2. 使用open()通过readlines读取文本文件以逐行读取
  3. 使用标签分割
  4. 如果col标题与条目匹配,则指定值计数++
  5. 如果有更好的主意,请告诉我。

    谢谢,

    AP

3 个答案:

答案 0 :(得分:2)

我认为你可以循环每一行并使用Counter用于词典和最后DataFrame构造函数。

如果每行中的值长度不相同,则read_csv失败。

import csv
from collections import Counter

with open('a.txt', 'r') as f:
    d = {row[0]: Counter([x for x in row[1:]]) for row in csv.reader(f, delimiter='\t')}

print (d)
{'L2': Counter({'B': 2, 'E': 2, 'D': 1}), 
 'L1': Counter({'A': 3, 'B': 1, 'C': 1, 'D': 1}),
 'L3': Counter({'G': 1, 'F': 1})}

df = pd.DataFrame.from_dict(d, orient='index').fillna(0).astype(int).sort_index(axis=1)
print (df)
    A  B  C  D  E  F  G
L1  3  1  1  1  0  0  0
L2  0  2  0  1  2  0  0
L3  0  0  0  0  0  1  1

答案 1 :(得分:2)

有点hacky方式是使用get_dummiesgroupby

为了阅读我们可以做的文本文件

df = pd.read_csv('untitled.txt',header=None)
df = df[0].str.split(expand=True).set_index(0)

#This will lead to
#    1  2     3     4     5     6
# 0                               
# L1  A  A     B     A     C     D
# L2  B  B     D     E     E  None
# L3  F  G  None  None  None  None

然后我们可以使用pd.get_dummies()

选项1

dummies= pd.get_dummies(df)
dummies.groupby(dummies.columns.str[-1],axis=1).sum()

选项2 :(快速使用stack和value_counts即)

df.stack().groupby(level=0).value_counts().unstack().fillna(0)
    A  B  C  D  E  F  G
0                      
L1  3  1  1  1  0  0  0
L2  0  2  0  1  2  0  0
L3  0  0  0  0  0  1  1

答案 2 :(得分:1)

假设您有一个类似于您粘贴的文本文件,可以使用

进行阅读
df = pandas.read_table('input.txt', delimiter=' *', 
                       header=None, engine='python', index_col=0)

获得DataFrame后,您可以计算如下计数:

result = df.apply(pandas.Series.value_counts, axis=1).fillna(0)

结果如下:

      A    B    C    D    E    F    G
0                                    
L1  3.0  1.0  1.0  1.0  0.0  0.0  0.0
L2  0.0  2.0  0.0  1.0  2.0  0.0  0.0
L3  0.0  0.0  0.0  0.0  0.0  1.0  1.0
相关问题