根据不同的列操作数据帧

时间:2017-06-27 17:30:24

标签: python pandas dataframe

我有一个数据框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

2 个答案:

答案 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