如何对条目进行分组、计算频率和平均值
How to group entries, calculate frequencies and averages
我想检查 key1
、key2
和 key3
在 df
中重复了多少次,并为每个键估计 [= 的平均值16=].
现在我可以只为单个键创建 keys_summary
(例如 key1
)。如何计算一行中所有键的频率?另外,如何将 num
的平均值添加到 keys_summary
?
import pandas as pd
s1 = pd.Series(['aaa abc','aaa cba','bbb bbc','aaa cba','bbb bbc'])
s2 = pd.Series([3,5,1,4,0])
df = pd.DataFrame({'descr': s1, 'num': s2})
print df
k1 = pd.Series(['aaa','abc','cba'])
k2 = pd.Series(['bbb','bbc'])
k3 = pd.Series(['ddd','ddc'])
keys = pd.DataFrame({'key1': k1,'key2': k2, 'key3': k3})
print keys
keys_summary = df['descr'].groupby(lambda x : x in keys['key1']).count()
print keys_summary
预期结果必须如下:
keys_summary
count avg_num
key1 3 4
key2 2 1
key3 0 0
Edit:这是一个替代答案,它不依赖于构建排列列表,而是期望每个键的值不相交(即没有值属于不止一串)。给定数据帧 df
和 keys
:
keys_summary = pd.DataFrame()
for col in keys:
keys_summary[col] = df[df.descr.apply(lambda x: any(word in x.split() for word in keys[col]))].describe().num
keys_summary = keys_summary.transpose()
对于问题中的示例,这会产生与下面给出的相同的数据框。
给定 keys
的数据框,您可以生成 2 乘 2 的排列列表(如果 descr
始终是两个键子字符串,即 - 否则可能需要进行一些小的修改)和然后在 df
中查看它们。使用 describe
方法获取统计信息。
import itertools
#df and keys as given
key_dict = {}
for col in keys:
perms = []
for (a,b) in itertools.permutations(keys[col].tolist(), 2):
perms.append(str(a) + ' ' + str(b))
key_dict[col] = perms
然后你使用这个字典和 df
数据框来生成一个 keys_summary
:
keys_summary = pd.DataFrame()
for k,v in key_dict.items():
keys_summary[k] = df[df.descr.isin(v)].describe().num
keys_summary = keys_summary.transpose()
这导致:
count mean std min 25% 50% 75% max
key3 0 NaN NaN NaN NaN NaN NaN NaN
key2 2 0.5 0.707107 0 0.25 0.5 0.75 1
key1 3 4.0 1.000000 3 3.50 4.0 4.50 5
如果不需要,您可以删除 min、25%、max 等列。
我想检查 key1
、key2
和 key3
在 df
中重复了多少次,并为每个键估计 [= 的平均值16=].
现在我可以只为单个键创建 keys_summary
(例如 key1
)。如何计算一行中所有键的频率?另外,如何将 num
的平均值添加到 keys_summary
?
import pandas as pd
s1 = pd.Series(['aaa abc','aaa cba','bbb bbc','aaa cba','bbb bbc'])
s2 = pd.Series([3,5,1,4,0])
df = pd.DataFrame({'descr': s1, 'num': s2})
print df
k1 = pd.Series(['aaa','abc','cba'])
k2 = pd.Series(['bbb','bbc'])
k3 = pd.Series(['ddd','ddc'])
keys = pd.DataFrame({'key1': k1,'key2': k2, 'key3': k3})
print keys
keys_summary = df['descr'].groupby(lambda x : x in keys['key1']).count()
print keys_summary
预期结果必须如下:
keys_summary
count avg_num
key1 3 4
key2 2 1
key3 0 0
Edit:这是一个替代答案,它不依赖于构建排列列表,而是期望每个键的值不相交(即没有值属于不止一串)。给定数据帧 df
和 keys
:
keys_summary = pd.DataFrame()
for col in keys:
keys_summary[col] = df[df.descr.apply(lambda x: any(word in x.split() for word in keys[col]))].describe().num
keys_summary = keys_summary.transpose()
对于问题中的示例,这会产生与下面给出的相同的数据框。
给定 keys
的数据框,您可以生成 2 乘 2 的排列列表(如果 descr
始终是两个键子字符串,即 - 否则可能需要进行一些小的修改)和然后在 df
中查看它们。使用 describe
方法获取统计信息。
import itertools
#df and keys as given
key_dict = {}
for col in keys:
perms = []
for (a,b) in itertools.permutations(keys[col].tolist(), 2):
perms.append(str(a) + ' ' + str(b))
key_dict[col] = perms
然后你使用这个字典和 df
数据框来生成一个 keys_summary
:
keys_summary = pd.DataFrame()
for k,v in key_dict.items():
keys_summary[k] = df[df.descr.isin(v)].describe().num
keys_summary = keys_summary.transpose()
这导致:
count mean std min 25% 50% 75% max
key3 0 NaN NaN NaN NaN NaN NaN NaN
key2 2 0.5 0.707107 0 0.25 0.5 0.75 1
key1 3 4.0 1.000000 3 3.50 4.0 4.50 5
如果不需要,您可以删除 min、25%、max 等列。