我正在使用制表符分隔文件:
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 pandas对这些数据进行排序:
df = pd.read_csv('file.txt', delimiter= '\t', names = ['A', 'B', 'C', 'D'])
df1.groupby(['a', 'c', 'd', 'e']).count()
但它没有返回所需的结果。
答案 0 :(得分:4)
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
<强>解释强>:
使用pd.melt
将所有列(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
...
然后您可以groupby/count A
和value
列:
In [520]: count = melted.groupby(['A', 'value'])['value'].count(); count
Out[520]:
A value
a d 2
domain 3
g 2
h 1
...
count.unstack('value')
将value
索引级别移动到列索引级别:
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
答案 1 :(得分:1)
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)
一步一步直觉:
- 将基于列
醇>A
和flatten
的每个组添加到列表中。我还将组名转换为具有出现次数的列表。
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']]
- 形成最终
醇>DataFrame
的原型。首先使用python build-intcount
计算每个列表中每个元素的出现次数,并使用generator
形成所需的数据结构。最后使用NaN
填充0
。
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
- 将
醇>DataFrame
原型转换为我们想要的方式
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