我有一个数据框df,其中有两列名为Rule_ID和Location。它有像 -
这样的数据this.keyboard.onKeyboardShow().subscribe(e => {
console.log('Keyboard height is: ' + e.keyboardHeight);
jQuery('body').animate({ 'marginTop': - e.keyboardHeight + 'px' }, 200);
});
this.keyboard.onKeyboardHide().subscribe(e => {
jQuery('body').animate({ 'marginTop': 0 + 'px' }, 200);
});
我想要两个结果。每个位置的唯一规则ID的一个计数。这应该看起来像 -
Rule_ID Location
[u'2c78g',u'df567',u'5ty78'] US
[u'2c78g',u'd67gh',u'df890o'] India
[u'd67gh',u'df890o',u'5ty78'] Japan
[u'2c78g',u'5ty78',u'df890o'] US
其次我想要根据位置计算rule_ids。这看起来像 -
Location Count_of_unique_rule_ids
US 4
India 3
Japan 3
等等!
这是此处问题的扩展 - Manipulating data frames
答案 0 :(得分:2)
这是一种方式
使用SecuritySupport
org.xml.sax.helpers.SecuritySupport
-
apply
<强>详情
列表上的 In [235]: df.groupby('Location')['Rule_ID'].apply(lambda x: len(set(x.sum())))
Out[235]:
Location
India 3
Japan 3
US 4
Name: Rule_ID, dtype: int64
加入它们,您可以通过计算列表集来获得唯一计数。
In [236]: (df.groupby('Location')
.apply(lambda x: pd.Series(x['Rule_ID'].sum()))
.reset_index()
.groupby(['Location', 0]).size())
Out[236]:
Location 0
India 2c78g 1
d67gh 1
df890o 1
Japan 5ty78 1
d67gh 1
df890o 1
US 2c78g 2
5ty78 2
df567 1
df890o 1
dtype: int64
在列表中应用x.sum()
会创建新行,然后在位置和度量上创建In [237]: df.groupby('Location')['Rule_ID'].apply(lambda x: x.sum())
Out[237]:
Location
India [2c78g, d67gh, df890o]
Japan [d67gh, df890o, 5ty78]
US [2c78g, df567, 5ty78, 2c78g, 5ty78, df890o]
Name: Rule_ID, dtype: object
。
pd.Series
答案 1 :(得分:1)
您需要将数据框架转换为长格式(不需要的列 Rule_ID ),之后可以直接进行总结:
df_long = pd.DataFrame({
"Rule_ID": [e for s in df.Rule_ID for e in s],
"Location": df.Location.repeat(df.Rule_ID.str.len())
})
df_long.groupby('Location').Rule_ID.nunique()
#Location
#India 3
#Japan 3
#US 4
#Name: Rule_ID, dtype: int64
df_long.groupby(['Rule_ID', 'Location']).size()
#Rule_ID Location
#u'2c78g' India 1
# US 2
#u'5ty78' Japan 1
# US 2
#u'd67gh' India 1
# Japan 1
#u'df567' US 1
#u'df890o' India 1
# Japan 1
# US 1
#dtype: int64