Pandas 列表中值的Groupby

Pandas 列表中值的Groupby,pandas,Pandas,我有一个很大的数据集,需要根据一个名为AoIs的列执行计算。例如,对于Name==“P_01”的所有点,我需要front位于AoIs列中的所有持续时间的总和。然后我想对侧和关注点表单执行相同的操作。我按名称对df进行分组,但我尝试的任何列表操作都失败了 以下是我正在处理的数据片段: Name AoIs duration 0 P_01 NaN 1704.0 1 P_01 Na

我有一个很大的数据集,需要根据一个名为AoIs的列执行计算。例如,对于
Name==“P_01”
的所有点,我需要
front
位于
AoIs
列中的所有持续时间的总和。然后我想对
关注点表单
执行相同的操作。我按名称对df进行分组,但我尝试的任何列表操作都失败了

以下是我正在处理的数据片段:

      Name               AoIs  duration
0     P_01                NaN    1704.0
1     P_01                NaN    1654.0
2     P_01                NaN     731.0
3     P_01                NaN    3317.0
4     P_01                NaN     897.0
5     P_01                NaN     773.0
6     P_01                NaN    1155.0
7     P_01       [side,front]    1064.0
8     P_01    [concerns_form]     299.0
9     P_01    [concerns_form]     390.0
df = pd.read_json('{"Name":{"0":"P_01","1":"P_01","2":"P_01","3":"P_01","4":"P_01","5":"P_01","6":"P_01","7":"P_01","8":"P_01","9":"P_01","10":"P_01","11":"P_01","12":"P_01","13":"P_01","14":"P_01","15":"P_01","16":"P_01","17":"P_01","18":"P_01","19":"P_01"},"AoIs":{"0":null,"1":null,"2":null,"3":null,"4":null,"5":null,"6":null,"7":["front", "side"],"8":["concerns_form","side"],"9":["concerns_form"],"10":["concerns_form"],"11":["concerns_title"],"12":["concerns_form"],"13":["concerns_submit"],"14":["side_nav"],"15":["concerns_title"],"16":["side_nav"],"17":["concerns_form"],"18":["concerns_title"],"19":["concerns_title"]},"duration":{"0":1704.0,"1":1654.0,"2":731.0,"3":3317.0,"4":897.0,"5":773.0,"6":1155.0,"7":1064.0,"8":299.0,"9":390.0,"10":1612.0,"11":1396.0,"12":2236.0,"13":798.0,"14":274.0,"15":182.0,"16":440.0,"17":166.0,"18":382.0,"19":282.0}}')
下面是一段代码,用于创建类似于我正在使用的df:

      Name               AoIs  duration
0     P_01                NaN    1704.0
1     P_01                NaN    1654.0
2     P_01                NaN     731.0
3     P_01                NaN    3317.0
4     P_01                NaN     897.0
5     P_01                NaN     773.0
6     P_01                NaN    1155.0
7     P_01       [side,front]    1064.0
8     P_01    [concerns_form]     299.0
9     P_01    [concerns_form]     390.0
df = pd.read_json('{"Name":{"0":"P_01","1":"P_01","2":"P_01","3":"P_01","4":"P_01","5":"P_01","6":"P_01","7":"P_01","8":"P_01","9":"P_01","10":"P_01","11":"P_01","12":"P_01","13":"P_01","14":"P_01","15":"P_01","16":"P_01","17":"P_01","18":"P_01","19":"P_01"},"AoIs":{"0":null,"1":null,"2":null,"3":null,"4":null,"5":null,"6":null,"7":["front", "side"],"8":["concerns_form","side"],"9":["concerns_form"],"10":["concerns_form"],"11":["concerns_title"],"12":["concerns_form"],"13":["concerns_submit"],"14":["side_nav"],"15":["concerns_title"],"16":["side_nav"],"17":["concerns_form"],"18":["concerns_title"],"19":["concerns_title"]},"duration":{"0":1704.0,"1":1654.0,"2":731.0,"3":3317.0,"4":897.0,"5":773.0,"6":1155.0,"7":1064.0,"8":299.0,"9":390.0,"10":1612.0,"11":1396.0,"12":2236.0,"13":798.0,"14":274.0,"15":182.0,"16":440.0,"17":166.0,"18":382.0,"19":282.0}}')

我会添加一些新的列,然后进行一些分组

df['side'] = df['AoIs'].map(str).str.contains('side')
df['front'] = df['AoIs'].map(str).str.contains('front')
df['concerns_form'] = df['AoIs'].map(str).str.contains('concerns_form')
然后结束,例如:

df[df['side']==True].groupby('Name').sum()

我会添加一些新的列,然后进行一些分组

df['side'] = df['AoIs'].map(str).str.contains('side')
df['front'] = df['AoIs'].map(str).str.contains('front')
df['concerns_form'] = df['AoIs'].map(str).str.contains('concerns_form')
然后结束,例如:

df[df['side']==True].groupby('Name').sum()

使用过滤后的
groupby

target = 'front'
df[[target in x if isinstance(x,list) else False for x in df.AoIs]].groupby('Name').duration.sum()
输出:

Name
P_01    1064

使用过滤后的
groupby

target = 'front'
df[[target in x if isinstance(x,list) else False for x in df.AoIs]].groupby('Name').duration.sum()
输出:

Name
P_01    1064

您可以将“AoIs”列拆分为两列,然后可以按其中一列或两列进行分组。这还允许您更改分组标准


df[['Right','Left']]=df['AoIs'].str.split(',',expand=True)

您可以将'AoIs'列拆分为两列,然后可以按其中一列或两列进行分组。这还允许您更改分组标准


df['Right',Left']]=df['AoIs'].str.split(',',expand=True)

from_json
应该是
read_json
否?
from_json
应该是
read_json
否?尽管有点慢,但为所有值获取假人的一个技巧是
df.AoIs.str.join('*').str.).str.get_dummies(sep='*')。astype(bool)
。然后你可以把它连接回你的原始页面。我想知道AoIs列是包含列表还是仅包含字符串。If list:man可以使用df['side']=df['AoIs'].map(lambda行:'side'在行中)虽然速度有点慢,但为所有值获取假人的一个技巧是
df.AoIs.str.join('*').str.get_dummies(sep='*').astype(bool)
。然后你可以把它连接回你的原始页面。我想知道AoIs列是包含列表还是仅包含字符串。如果列表:人可以使用df['side']=df['AoIs'].map(lambda行:“side”在行中)