Python 选择具有条件的组中的行
上面有一个按日期排序的数据框(a列)。列E保存星期几的引用。我需要一个新的df,根据以下条件过滤行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
- 如果日期同时有“星期四”和“星期五”引用(与“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”组同时具有“星期四”和“星期五”引用。解决方案中的拼写错误。拼错了星期三。