使用 if 语句子集 df - 熊猫



我希望使用if语句创建并返回一个子集df。具体来说,对于下面的代码,我有两组不同的值。我要返回的df将根据这些值之一而有所不同。

使用以下代码,特定值将在normaldifferent内。place中的值将指示如何对df进行子集化。

以下是我的尝试。place中的值将永远只是一个值,因此它不会完全匹配列表。当place中的值等于这些列表中的单个值时,是否可以返回df

我希望返回df1以用于后续任务。

import pandas as pd
df = pd.DataFrame({
'period' : [1.0, 1.0, 2.0, 2.0, 3.0, 4.0, 5.0, 7.0, 7.0, 8.0, 9.0],                                
})
place = 'a'
normal = ['a','b']
different = ['v','w','x','y','z']
different_subset_start = 2
normal_subset_start = 4
subset_end = 8
for val in df:
if place in different:
print('place is different')
df1 = df[(df['period'] >= different_subset_start) & (df['period'] <= subset_end)].drop_duplicates(subset = 'period')
return df1
elif place in normal:
print('place is normal')
df1 = df[(df['period'] >= normal_subset_start) & (df['period'] <= subset_end)].drop_duplicates(subset = 'period')
return df1
else:
print('Incorrect input for Day. Day Floater could not be scheduled. Please check input value')
return

打印(DF1(

预期的输出是返回df1供以后使用。

period
2     2.0
4     3.0
5     4.0
6     5.0
7     7.0
9     8.0

要检查对象是否在某物,而不是检查它是否等于某物,请使用in

if place in different:

和类似

elif place in normal:

编辑:

如果你把它变成一个函数,它应该是什么样子。基本上,你只需要做一件def my_function_name(arguments):的事情,然后缩进你的代码的其余部分,使其属于该函数。喜欢这个:

import pandas as pd
def get_subset(df, place):
normal = ['a','b']
different = ['v','w','x','y','z']
different_subset_start = 2
normal_subset_start = 4
subset_end = 8
if place in different:
df1 = df[(df['period'] >= different_subset_start) & (df['period'] <= subset_end)].drop_duplicates(subset = 'period')
elif place in normal:
df1 = df[(df['period'] >= normal_subset_start) & (df['period'] <= subset_end)].drop_duplicates(subset = 'period')
else:
df1 = None
return df1
df = pd.DataFrame({
'period' : [1.0, 1.0, 2.0, 2.0, 3.0, 4.0, 5.0, 7.0, 7.0, 8.0, 9.0],                             
})
place = 'a'
print(get_subset(df, place))

查看代码中的for val in df:。 这样的结构很奇怪,因为你不使用val变量。

将代码的最后一个片段更改为如下所示的内容:

def fn():
if place in different:
print('place is different')
return df[df.period.between(different_subset_start, subset_end)]
.drop_duplicates(subset='period')
elif place in normal:
print('place is normal')
return df[df.period.between(normal_subset_start, subset_end)]
.drop_duplicates(subset = 'period')
else:
print('Incorrect input for place. Please check value')

在您的情况下subset = 'period'是多余的,因为句号是唯一的 列。

也不需要最后一次返回。如果函数执行来了 到代码末尾,它返回而不返回任何值。

另一个细节:如果你的数据只有列,那么 也许一个系列就足够了?

最新更新