Python 使用熊猫统计大数据中的条目
我正在使用选项卡分隔的文件:Python 使用熊猫统计大数据中的条目,python,pandas,Python,Pandas,我正在使用选项卡分隔的文件: A B C D a d ii do a d g do a h g do a i k mo c i k mo c g ii mo v g p do 我想计算第一列中的每个条目,以及第二列、第三列和第四列中与其相关的所有条目,如: a 4 d 2 h 1 i 1 ii 1 k 1 domain 3 motif 1 c 2 i 1
A B C D
a d ii do
a d g do
a h g do
a i k mo
c i k mo
c g ii mo
v g p do
我想计算第一列中的每个条目,以及第二列、第三列和第四列中与其相关的所有条目,如:
a 4 d 2 h 1 i 1 ii 1 k 1 domain 3 motif 1
c 2 i 1 g 1 k 1 ii 1 motif 2
v 1 g 1 p 1 motif 1
我试图通过以下命令使用python对这些数据进行排序:
df = pd.read_csv('file.txt', delimiter= '\t', names = ['A', 'B', 'C', 'D'])
df1.groupby(['a', 'c', 'd', 'e']).count()
但它不会返回期望的结果
import pandas as pd
df = pd.DataFrame({'A': ['a', 'a', 'a', 'a', 'c', 'c', 'v'],
'B': ['d', 'd', 'h', 'i', 'i', 'g', 'g'],
'C': ['ii', 'g', 'g', 'k', 'k', 'ii', 'p'],
'D': ['domain', 'domain', 'domain', 'motif',
'motif', 'motif', 'domain']})
melted = pd.melt(df, id_vars='A')
count = melted.groupby(['A', 'value'])['value'].count()
result = count.unstack(fill_value=0)
result['A'] = df.groupby('A')['A'].count()
print(result)
屈服
value d domain g h i ii k motif p A
A
a 2 3 2 1 1 1 1 1 0 4
c 0 0 1 0 1 1 1 2 0 2
v 0 1 1 0 0 0 0 0 1 1
说明:
- 用于将所有列(除了
列)合并为一个列:A
In [517]: melted = pd.melt(df, id_vars='A'); melted Out[517]: A variable value 0 a B d 1 a B d 2 a B h 3 a B i 4 c B i ...
- 然后您可以选择
和A
列:值
In [520]: count = melted.groupby(['A', 'value'])['value'].count(); count Out[520]: A value a d 2 domain 3 g 2 h 1 ...
- 将
索引级别移动到列索引级别:值
In [522]: count.unstack('value', fill_value=0) Out[522]: value d domain g h i ii k motif p A a 2 3 2 1 1 1 1 1 0 c 0 0 1 0 1 1 1 2 0 v 0 1 1 0 0 0 0 0 1
A
和将每个组展平到一个列表中进行分组。我还将组名转换为带有出现次数的列表
count
计算每个列表中每个元素的出现次数,并使用generator
形成所需的数据结构。最后用0
填充NaN
DataFrame
原型转换为我们想要的方式很不错的!如果您还想包括
A
列的计数(如原件中所示)?@unutbu谢谢,这与我要查找的非常接近,如果我们还想包括'A'列中的条目计数,如我最初的问题“A 4 c 2 v 1??有什么建议吗?您可以使用结果['A']计算这些值吗=df.groupby('A')['A'].count()
。我已经编辑了上面的文章以显示结果。
import pandas as pd
df = pd.DataFrame({'A': ['a', 'a', 'a', 'a', 'c', 'c', 'v'],
'B': ['d', 'd', 'h', 'i', 'i', 'g', 'g'],
'C': ['ii', 'g', 'g', 'k', 'k', 'ii', 'p'],
'D': ['domain', 'domain', 'domain', 'motif',
'motif', 'motif', 'domain']})
n = [name for name,g in df.groupby('A')] # remember the index names
d= [[name]*g['A'].count() + g[['B','C','D']].values.flatten().tolist() for name, g in df.groupby('A')]
rslt = pd.DataFrame([dict((x,r.count(x)) for x in r) for r in d]).fillna(0)
rslt['count'] = rslt[n].sum(axis=1)
rslt.set_index(pd.Index(n), inplace=True)
rslt.drop(n, axis=1, inplace=True)
d
Out[138]:
[['a',
'a',
'a',
'a',
'd',
'ii',
'domain',
'd',
'g',
'domain',
'h',
'g',
'domain',
'i',
'k',
'motif'],
['c', 'c', 'i', 'k', 'motif', 'g', 'ii', 'motif'],
['v', 'g', 'p', 'domain']]
pd.DataFrame([dict((x,r.count(x)) for x in r) for r in d]).fillna(0)
Out[141]:
a c d domain g h i ii k motif p v
0 4 0 2 3 2 1 1 1 1 1 0 0
1 0 2 0 0 1 0 1 1 1 2 0 0
2 0 0 0 1 1 0 0 0 0 0 1 1
rslt
Out[143]:
d domain g h i ii k motif p count
a 2 3 2 1 1 1 1 1 0 4
c 0 0 1 0 1 1 1 2 0 2
v 0 1 1 0 0 0 0 0 1 1