基于groupby操作的dataframe新列

玩世不恭
import pandas
import numpy

df = pandas.DataFrame({'id_1' : [1,2,1,1,1,1,1,2,2,2,2], 
                      'id_2' :  [1,1,1,1,1,2,2,2,2,2,2],
                      'v_1' :   [2,1,1,3,2,1,2,4,1,1,2],
                      'v_2' :   [1,1,1,1,2,2,2,1,1,2,2],
                      'v_3' :   [3,3,3,3,4,4,4,3,3,3,3]})


In [4]: df                                                                                                                                                                                                  
Out[4]: 
    id_1  id_2  v_1  v_2  v_3
0      1     1    2    1    3
1      2     1    1    1    3
2      1     1    1    1    3
3      1     1    3    1    3
4      1     1    2    2    4
5      1     2    1    2    4
6      1     2    2    2    4
7      2     2    4    1    3
8      2     2    1    1    3
9      2     2    1    2    3
10     2     2    2    2    3

sub = df[(df['id_1'] == 1) & (df['id_2'] == 1)].copy()
sub['v_4'] = numpy.where(sub['v_1'] == sub['v_2'].shift(), 'A', \
                         numpy.where(sub['v_1'] == sub['v_3'].shift(), 'B', 'C'))


In [6]: sub                                                                                                                                                                                                 
Out[6]: 
   id_1  id_2  v_1  v_2  v_3 v_4
0     1     1    2    1    3   C
2     1     1    1    1    3   A
3     1     1    3    1    3   B
4     1     1    2    2    4   C

我有一个上面定义的数据框。我想执行一些操作,基本上对每组(id_1,id_2)的v_1是否等于先前的v_2或v_3进行分类,我已经对子df执行了该操作。而且我想用一行代码将以下groupby与对sub df进行的操作组合在一起。

gbdf = df.groupby(by=['id_1', 'id_2'])

我已经尝试过类似的东西

gbdf['v_4'] = numpy.where(gbdf['v_1'] == gbdf['v_2'].shift(), 'A', \
                         numpy.where(gbdf['v_1'] == gbdf['v_3'].shift(), 'B', 'C'))

错误是

'DataFrameGroupBy' object does not support item assignment

我也试过

df['v_4'] = numpy.where(gbdf['v_1'] == gbdf['v_2'].shift(), 'A', \
                         numpy.where(gbdf['v_1'] == gbdf['v_3'].shift(), 'B', 'C'))

我认为结果是错误的,它没有使groupby结果与原始顺序对齐。

我想知道是否有一种优雅的方法来实现这一目标。

格里斯玛

这将为您提供与数据框内容匹配的数据框列表sub,但适用于以下所有结果.groupby()

import numpy
import pandas

source = pandas.DataFrame(
    {'id_1': [1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2],
     'id_2': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
     'v_1': [2, 1, 1, 3, 2, 1, 2, 4, 1, 1, 2],
     'v_2': [1, 1, 1, 1, 2, 2, 2, 1, 1, 2, 2],
     'v_3': [3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3]})


def add_v4(df):
    df['v_4'] = numpy.where(df['v_1'] == df['v_2'].shift(), 'A', numpy.where(df['v_1'] == df['v_3'].shift(), 'B', 'C'))
    return df


dfs = [add_v4(pandas.DataFrame(slice)) for _, slice in source.groupby(by=['id_1', 'id_2'])]
print(dfs)

关于这条线:

dfs = [add_v4(pandas.DataFrame(slice)) for _, slice in source.groupby(by=['id_1', 'id_2'])]

这是一种列表推导,可以从中获取所有切片,groupby然后将它们切成实际的新数据帧,然后再将它们传递给add_v4,这将返回修改后的数据帧以添加到列表中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于DataFrame列的操作

来自分类Dev

python dataframe groupby并追加新列

来自分类Dev

Python:pandas DataFrame基于其他列的新列

来自分类Dev

基于过滤器在Pandas DataFrame中创建新列

来自分类Dev

Pandas DataFrame基于多个条件的分组添加新的列值

来自分类Dev

Pandas DataFrame,如何基于多行计算新的列元素

来自分类Dev

在大熊猫的日期级别基于groupby date time列创建一个新列

来自分类Dev

在pandas的Dataframe中插入一些基于新列的值的新列

来自分类Dev

DataFrame中的新列基于另一个DataFrame中的行和列

来自分类Dev

如何基于另一个 DataFrame 中的列在 Pandas DataFrame 中创建新列?

来自分类Dev

如何基于基于行的计算向我的Pandas DataFrame追加新列?

来自分类Dev

熊猫-从groupby操作的前n个组创建一个新的DataFrame

来自分类Dev

在SparkR中,如何基于现有列的逻辑操作添加新列?

来自分类Dev

在pyspark中使用groupby基于过滤的行创建具有最大值的新列

来自分类Dev

熊猫-Groupby并创建新的DataFrame?

来自分类Dev

基于唯一的多列索引的另一个DataFrame的新pandas DataFrame

来自分类常见问题

Groupby基于应用于多个列DataFrame的多个逻辑条件

来自分类Dev

基于 groupby 的 DataFrame 过滤器

来自分类Dev

对熊猫groupby对象的列操作

来自分类Dev

如何基于Python Pandas中的其他列在DataFrame中创建新列?

来自分类Dev

DataFrame:基于另一列中的单词创建新列

来自分类Dev

如何基于组合 1 和多列在 Pandas DataFrame 中创建新列

来自分类Dev

开发基于Ubuntu的新操作系统

来自分类Dev

Pyspark - 从 DataFrame 列的操作创建新列给出错误“列不可迭代”

来自分类Dev

pandas 数据框创建一个新列,其值基于另一列上的 groupby sum

来自分类Dev

按列对DataFrame进行分组,对成员执行操作,然后在新的DataFrame中输出结果

来自分类Dev

在执行GroupBy操作后,如何从spark DataFrame列收集字符串列表?

来自分类Dev

DataFrame列操作

来自分类常见问题

基于条件的新列值

Related 相关文章

  1. 1

    基于DataFrame列的操作

  2. 2

    python dataframe groupby并追加新列

  3. 3

    Python:pandas DataFrame基于其他列的新列

  4. 4

    基于过滤器在Pandas DataFrame中创建新列

  5. 5

    Pandas DataFrame基于多个条件的分组添加新的列值

  6. 6

    Pandas DataFrame,如何基于多行计算新的列元素

  7. 7

    在大熊猫的日期级别基于groupby date time列创建一个新列

  8. 8

    在pandas的Dataframe中插入一些基于新列的值的新列

  9. 9

    DataFrame中的新列基于另一个DataFrame中的行和列

  10. 10

    如何基于另一个 DataFrame 中的列在 Pandas DataFrame 中创建新列?

  11. 11

    如何基于基于行的计算向我的Pandas DataFrame追加新列?

  12. 12

    熊猫-从groupby操作的前n个组创建一个新的DataFrame

  13. 13

    在SparkR中,如何基于现有列的逻辑操作添加新列?

  14. 14

    在pyspark中使用groupby基于过滤的行创建具有最大值的新列

  15. 15

    熊猫-Groupby并创建新的DataFrame?

  16. 16

    基于唯一的多列索引的另一个DataFrame的新pandas DataFrame

  17. 17

    Groupby基于应用于多个列DataFrame的多个逻辑条件

  18. 18

    基于 groupby 的 DataFrame 过滤器

  19. 19

    对熊猫groupby对象的列操作

  20. 20

    如何基于Python Pandas中的其他列在DataFrame中创建新列?

  21. 21

    DataFrame:基于另一列中的单词创建新列

  22. 22

    如何基于组合 1 和多列在 Pandas DataFrame 中创建新列

  23. 23

    开发基于Ubuntu的新操作系统

  24. 24

    Pyspark - 从 DataFrame 列的操作创建新列给出错误“列不可迭代”

  25. 25

    pandas 数据框创建一个新列,其值基于另一列上的 groupby sum

  26. 26

    按列对DataFrame进行分组,对成员执行操作,然后在新的DataFrame中输出结果

  27. 27

    在执行GroupBy操作后,如何从spark DataFrame列收集字符串列表?

  28. 28

    DataFrame列操作

  29. 29

    基于条件的新列值

热门标签

归档