Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 选择具有条件的组中的行_Python_Pandas - Fatal编程技术网

Python 选择具有条件的组中的行

Python 选择具有条件的组中的行,python,pandas,Python,Pandas,上面有一个按日期排序的数据框(a列)。列E保存星期几的引用。我需要一个新的df,根据以下条件过滤行 如果日期同时有“星期四”和“星期五”引用(与“2002-01-14”一样),我只想保留引用“星期三”到“星期六”的行 否则(对于“2002-01-13”和“2002-01-15”A组),保留参考“星期二”到“星期六”的行(上述示例中的所有行) 输出应为: A D E 0 2002-01-13 3.3 Tuesday 1 2002

上面有一个按日期排序的数据框(a列)。列E保存星期几的引用。我需要一个新的df,根据以下条件过滤行

  • 如果日期同时有“星期四”和“星期五”引用(与“2002-01-14”一样),我只想保留引用“星期三”到“星期六”的行
  • 否则(对于“2002-01-13”和“2002-01-15”A组),保留参考“星期二”到“星期六”的行(上述示例中的所有行)
输出应为:

             A    D          E
0   2002-01-13  3.3    Tuesday
1   2002-01-13  3.9  Wednesday
2   2002-01-13  1.9   Thursday
3   2002-01-13  9.0   Saturday
4   2002-01-14  0.9    Tuesday
5   2002-01-14  0.2  Wednesday
6   2002-01-14  5.1   Thursday
7   2002-01-14  7.0     Friday
8   2002-01-14  1.9   Saturday
9   2002-01-15  4.2    Tuesday
10  2002-01-15  6.7  Wednesday
11  2002-01-15  1.2     Friday
12  2002-01-15  0.6   Saturday
我试过:

             A    D          E
0   2002-01-13  3.3    Tuesday
1   2002-01-13  3.9  Wednesday
2   2002-01-13  1.9   Thursday
3   2002-01-13  9.0   Saturday
5   2002-01-14  0.2  Wednesday
6   2002-01-14  5.1   Thursday
7   2002-01-14  7.0     Friday
8   2002-01-14  1.9   Saturday
9   2002-01-15  4.2    Tuesday
10  2002-01-15  6.7  Wednesday
11  2002-01-15  1.2     Friday
12  2002-01-15  0.6   Saturday

groupby
上使用一个简单的自定义函数可以得到答案:

m1 = (group["E"] == "Wednesday")
m2 = (group["E"] == "Thursday")

grouped = df.groupby("A")

for idx, group in grouped:

    if (m1|m2).any():
        df[idx] = group[m1|m2]
    else:
        df[idx] = group[m2]

groupby
上使用一个简单的自定义函数可以得到答案:

m1 = (group["E"] == "Wednesday")
m2 = (group["E"] == "Thursday")

grouped = df.groupby("A")

for idx, group in grouped:

    if (m1|m2).any():
        df[idx] = group[m1|m2]
    else:
        df[idx] = group[m2]

您可以使用
np尝试此操作。其中
isin

# helper function
def get_grp(grp):

    # values to consider
    a = ['Thursday', 'Friday']

    # set up condition
    cond = all(True if i in grp['E'].tolist() else False for i in a)

    # check conditions
    if cond:
        return grp[grp['E'].isin(['Wednesday','Thursday','Friday','Saturday'])]
    else:
        return grp[grp['E'].isin(['Tuesday','Wednesday','Thursday','Friday','Saturday'])]

## apply function on groupby object

df = df.groupby('A',as_index=False).apply(get_grp).reset_index(drop=True)

## output
df.head(7)

    A   D   E
0   2002-01-13  3.3     Tuesday
1   2002-01-13  3.9     Wednesday
2   2002-01-13  1.9     Thursday
3   2002-01-13  9.0     Saturday
4   2002-01-14  0.2     Wednesday
5   2002-01-14  5.1     Thursday
6   2002-01-14  7.0     Friday
7   2002-01-14  1.9     Saturday
输出:

df[df.groupby('A')['E']
     .transform(lambda x: np.where(x.eq('Thursday').any() & x.eq('Friday').any(),
                               x.isin(['Wednesday','Thursday','Friday','Saturday']),
                               x.isin(['Tuesday','Wednesday','Thursday','Friday','Saturday'])))]

您可以使用
np尝试此操作。其中
isin

# helper function
def get_grp(grp):

    # values to consider
    a = ['Thursday', 'Friday']

    # set up condition
    cond = all(True if i in grp['E'].tolist() else False for i in a)

    # check conditions
    if cond:
        return grp[grp['E'].isin(['Wednesday','Thursday','Friday','Saturday'])]
    else:
        return grp[grp['E'].isin(['Tuesday','Wednesday','Thursday','Friday','Saturday'])]

## apply function on groupby object

df = df.groupby('A',as_index=False).apply(get_grp).reset_index(drop=True)

## output
df.head(7)

    A   D   E
0   2002-01-13  3.3     Tuesday
1   2002-01-13  3.9     Wednesday
2   2002-01-13  1.9     Thursday
3   2002-01-13  9.0     Saturday
4   2002-01-14  0.2     Wednesday
5   2002-01-14  5.1     Thursday
6   2002-01-14  7.0     Friday
7   2002-01-14  1.9     Saturday
输出:

df[df.groupby('A')['E']
     .transform(lambda x: np.where(x.eq('Thursday').any() & x.eq('Friday').any(),
                               x.isin(['Wednesday','Thursday','Friday','Saturday']),
                               x.isin(['Tuesday','Wednesday','Thursday','Friday','Saturday'])))]

您的输出看起来与输入数据完全相似。请检查一下。不,不一样。请阅读有关StackOverflow的说明。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。在这种情况下,在源代码中构建初始数据帧;然后显示实际得到的输出。确保您的代码按发布的方式运行。您的输出看起来与输入数据完全相似。请检查一下。不,不一样。请阅读有关StackOverflow的说明。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。在这种情况下,在源代码中构建初始数据帧;然后显示实际得到的输出。确保您的代码按发布的方式运行。输出应包含:“5 2002-01-14 0.2星期三”,因为“2002-01-14”组同时具有“星期四”和“星期五”引用。解决方案中的键入错误。拼写错误的星期三。输出应包含:“5 2002-01-14 0.2星期三”,因为“2002-01-14”组同时具有“星期四”和“星期五”引用。解决方案中的拼写错误。拼错了星期三。