我想从行数据创建一个计数表,其中的条目由制表符分隔。例如,
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
这是我想到的算法:
如果有更好的主意,请告诉我。
谢谢,
AP
答案 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_dummies
和groupby
即
为了阅读我们可以做的文本文件
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