PANDAS DATAFRAME,根据选择其他行的选择分配值



我在python 3中有pandas dataframe。

在此数据框中,有两个列中具有相同值的行(这可以是整个部分),我将其称为组。每行还具有True/False值。

现在,对于每一行,我想知道其组中的行是否是否具有False值,如果是的,则我想为另一组中的每个行分配一个False值。我设法在循环中做到了这一点,但这很慢:

import pandas as pd
import numpy as np
df = pd.DataFrame({'E': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                   'D': [0, 1, 2, 3, 4, 5, 6],
                   'C': [True, True, False, False, True, True, True],
                   'B': ['aa', 'aa', 'aa', 'bb', 'cc', 'dd', 'dd'],
                   'A': [0, 0, 0, 0, 1, 1, 1]})

给出:

df:
     A   B      C  D    E
  0  0  aa   True  0  NaN
  1  0  aa   True  1  NaN
  2  0  aa  False  2  NaN
  3  0  bb  False  3  NaN
  4  1  cc   True  4  NaN
  5  1  dd   True  5  NaN
  6  1  dd   True  6  NaN

现在我运行了前面的:

for i in df.index:
    df.ix[i, 'E'] = df[(df['A'] == df.iloc[i]['A']) & (df['B'] == df.iloc[i]['B'])]['C'].all()

然后给出所需的结果:

df:
     A   B      C  D      E
  0  0  aa   True  0  False
  1  0  aa   True  1  False
  2  0  aa  False  2  False
  3  0  bb  False  3  False
  4  1  cc   True  4   True
  5  1  dd   True  5   True
  6  1  dd   True  6   True

为我的整个数据框架运行时,大约100万行这需要很长时间。因此,查看使用.apply()来避免我偶然发现了以下问题:将函数应用于pandas dataFrame,其重新调整值基于其他行

但是:

def f(x): return False not in x
df.groupby(['A','B']).C.apply(f)

返回:

A  B 
0  aa    False
   bb     True
1  cc     True
   dd     True

有人知道一种更好的方法还是如何修复最后的情况?

您可以尝试使用pd.merge加入SQL风格。

执行与您要做的相同组,但将min()应用于c == true的任何情况。然后将其转换为dataFrame,将列命名为" E",然后将其合并回DF。

df = pd.DataFrame({'D': [0, 1, 2, 3, 4, 5, 6],
               'C': [True, True, False, False, True, True, True],
               'B': ['aa', 'aa', 'aa', 'bb', 'cc', 'dd', 'dd'],
               'A': [0, 0, 0, 0, 1, 1, 1]})
falses = pd.DataFrame(df.groupby(['A', 'B']).C.min() == True)
falses = falses.rename(columns={'C': 'E'})
df = df.merge(falses, left_on=['A', 'B'], right_index=True)

最新更新