Python 转换熊猫&x27;使用apply将数据帧组迭代转换为groupby

Python 转换熊猫&x27;使用apply将数据帧组迭代转换为groupby,python,pandas,Python,Pandas,我需要将一个数据帧拆分为多个组,对于那些具有奇数行的组,我需要拉入列与某个条件匹配的第一行,然后我需要重新组合所有这些第一行(因此只有奇数组中与某个条件匹配的第一行)。我可以在下面这样的循环中完成它(它可以工作),但不能用apply将其重新编写成groupby。你能帮忙吗 grp_by_cols=['A','B'] new_df=pd.DataFrame(columns=grp_by_cols) for name, group in txn.groupby(grp_by_cols): if le

我需要将一个数据帧拆分为多个组,对于那些具有奇数行的组,我需要拉入列与某个条件匹配的第一行,然后我需要重新组合所有这些第一行(因此只有奇数组中与某个条件匹配的第一行)。我可以在下面这样的循环中完成它(它可以工作),但不能用apply将其重新编写成groupby。你能帮忙吗

grp_by_cols=['A','B']
new_df=pd.DataFrame(columns=grp_by_cols)
for name, group in txn.groupby(grp_by_cols):
if len(group) % 2 != 0:
    new_df=new_df.append(group[group['C']=='something')].head(1))

我将通过编写一个函数来解决这个有趣的问题,然后将其传递给应用程序

假设您有这样的数据(可以方便地回答这个问题):

其中key是您将分组的列,“data1”是您将用于测试条件的列。这些数据对第1组、第3组、第5组和第7组的观察结果为奇数。第一次观察时,这些组的“数据1”值为“A”、“B”、“A”、“B”。例如,假设您希望获得一个新的数据帧,其中包含这些组中的第一个观察值,但仅当第一行中的“data1”值等于B时。我们可以编写如下通用函数:

def apply_func(df, col, condition):
    if len(df)%2 == 0:
        return None
    else:
        if df.irow(0)[col] == condition:
            return df.irow(0)
        else:
            return None
然后按如下方式对小组进行呼叫:

DF.groupby('key').apply(apply_func, 'data1', 'B').dropna()
这将提供以下输出:

  data1     data2  key
2     B  0.980814    3
6     B  0.428402    7
如果我没有弄错的话,这就是您想要生成的输出类型

当然,您实际上并不需要函数中的所有分支,我包含它们只是为了让它更清楚。编写函数最简洁的方法是:

def apply_func(df, col, condition):
    if len(df)%2 != 0 and df.irow(0)[col] == condition:
        return df.irow(0)

请注意,当调用传递要应用的函数时,传递的第一个参数是数据帧本身,这是自动完成的。这就是为什么在传递要应用的函数时不需要指定'df'参数的原因。事实上,如果你这样做了,你会得到一个错误,说你传递了太多的参数。在我看来,还有点奇怪,在传递函数时,参数是在逗号之后提供的,而不是在括号中。这让我感到困惑,但事实就是如此

经典的!谢谢你,先生
def apply_func(df, col, condition):
    if len(df)%2 != 0 and df.irow(0)[col] == condition:
        return df.irow(0)