对数据框进行条件以创建新的数据框-Python

约翰·杜

我有一个数据框如下。

    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个条件创建一个数据框。

  1. 如果id唯一,并输入!= b,则换行并添加case1列
  2. 如果id唯一且类型= b,则在名称唯一的情况下采用行并添加case2列
  3. 如果id不是唯一的,并输入!= b,则汇总具有相同日期的行,求和,并添加case3列
  4. 如果id不唯一且类型= b,则聚合具有相同date的行,将忽略b类型的行的值求和,然后添加case4列

新的数据框如下

    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(列的列表)创建另一个组然后sumvalue这些组中的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python,Pandas从数据框创建新数据

在多种条件下对数据框进行切片Python

Python / Pandas:通过匹配的索引条件对数据框进行子集

Python熊猫,在定义df之前先对数据框进行条件处理

根据条件从数据框创建python列表

使用条件分组创建python数据框

Python Pandas过滤并创建新的数据框

在python数据框中创建新的矢量

在Python中使用列总和对数据框进行子集

在python中对数据框进行子集化时出错

使用python对数据框中的每个项目进行排序

使用python pandas对数据框进行排序

移位数据并创建新列-Python数据框

Python熊猫对数据框列进行分组,并使用它们来计算Excel工作表中的新列

Python熊猫根据上述某些行上的条件在数据框中创建新行

如何根据python数据框中现有列的条件创建新列?

Python:处理不同大小的数据框以根据日期时间条件创建新列

符合给定条件的总和值并创建一个新的数据框(python)

使用 .loc 对数据进行分类并使用 python 将数据框迭代到 CSV 文件

从数组python创建数据框

在 Python 中创建新数据框的棘手多重转换

Python 创建新的数据框分组和汇总列

Python根据不同的行创建新的数据框列

优化从数据框提取列表以在Python中创建新变量

python循环并为列的每个值创建新的数据框

从现有的Python组织和创建新的数据框

Pandas \ Python:通过成对比较创建新的数据框

在python中使用曼哈顿距离创建新的数据框

基于逗号分割并在 Python 中创建新的数据框