我有一个数据框如下。
id type value Date name
0 111 a 100 2018/11 x1
1 112 b 200 2018/12 x2
2 113 a 300 2018/08 x3
3 113 a 200 2018/08 x4
4 114 a 300 2017/12 x4
5 114 a 500 2018/12 x5
6 114 b 500 2018/12 x5
我想基于4个条件创建一个数据框。
新的数据框如下
id type value Date case
0 111 a 100 2018/11 case1
1 112 b 200 2018/12 case2
2 113 a 500 2018/08 case3
3 114 a 300 2017/12 case4
4 114 b 500 2018/12 case4
我尝试创建列“案例”作为我的第一步:
对于我在df.id.unique()中:
if 'b' in df.Type: df['Case']= 'case 1' else: df['Case']= 'case 2' else:
其他:
if 'b' in df.Type: df['Case']= 'case 3' else: df['Case']= 'case 4'
我是大熊猫操作的新手,因此建议将不胜感激
您可以使用此:
# groupby and add group sizes
df['id_count'] = df.groupby('id')['id'].transform('size')
# conditions for np.select
conditions = [
(df['id_count'].eq(1) & df['type'].ne('b')),
(df['id_count'].eq(1) & df['type'].eq('b')),
(df['id_count'].ne(1) & df['type'].ne('b')),
(df['id_count'].ne(1) & df['type'].eq('b'))]
# choices for np.select
choices = ['case1', 'case2', 'case3', 'case4']
# Add case column
df['case'] = np.select(conditions, choices, default=None)
# next grouping
grouping = ['id', 'type', 'Date', 'case']
# replace value column
df['value'] = df.groupby(grouping)['value'].transform('sum')
# drop duplicate rows
df = df.drop_duplicates(subset=grouping, keep='first')
# remove extra columns
df = df.drop(['name', 'id_count'], axis='columns')
首先,你可以创建一个groupby
对的id
列,如下所示:
gb = df.groupby('id')
然后,您可以使用它来计算id
发生的次数:
df['id_count'] = gb['id'].transform('size')
df
现在看起来像这样:
id type value Date name id_count
0 111 a 100 2018/11 x1 1
1 112 b 200 2018/12 x2 1
2 113 a 300 2018/08 x3 2
3 113 a 200 2018/08 x4 2
4 114 a 300 2017/12 x4 3
5 114 a 500 2018/12 x5 3
6 114 b 500 2018/12 x5 3
现在,您可以使用以下np.select
条件:
conditions = [
(df['id_count'].eq(1) & df['type'].ne('b')),
(df['id_count'].eq(1) & df['type'].eq('b')),
(df['id_count'].ne(1) & df['type'].ne('b')),
(df['id_count'].ne(1) & df['type'].eq('b'))]
choices = ['case1', 'case2', 'case3', 'case4']
df['case'] = np.select(conditions, choices, default=None)
导致:
id type value Date name id_count case
0 111 a 100 2018/11 x1 1 case1
1 112 b 200 2018/12 x2 1 case2
2 113 a 300 2018/08 x3 2 case3
3 113 a 200 2018/08 x4 2 case3
4 114 a 300 2017/12 x4 3 case3
5 114 a 500 2018/12 x5 3 case3
6 114 b 500 2018/12 x5 3 case4
通过使用grouping
(列的列表)创建另一个组;然后sum
将value
这些组中的value
列替换为该列。
grouping = ['id', 'type', 'Date', 'case']
df['value'] = df.groupby(grouping)['value'].transform('sum')
导致:
id type value Date name id_count case
0 111 a 100 2018/11 x1 1 case1
1 112 b 200 2018/12 x2 1 case2
2 113 a 500 2018/08 x3 2 case3
3 113 a 500 2018/08 x4 2 case3
4 114 a 300 2017/12 x4 3 case3
5 114 a 500 2018/12 x5 3 case3
6 114 b 500 2018/12 x5 3 case4
最后,drop-duplicates
使用grouping
之前的列表:
df = df.drop_duplicates(subset=grouping, keep='first')
给予:
id type value Date name id_count case
0 111 a 100 2018/11 x1 1 case1
1 112 b 200 2018/12 x2 1 case2
2 113 a 500 2018/08 x3 2 case3
4 114 a 300 2017/12 x4 3 case3
6 114 b 500 2018/12 x5 3 case4
您可以使用删除多余的列drop
:
df = df.drop(['name', 'id_count'], axis='columns')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句