使用if语句对df进行子集设置-Pandas

时间:2019-08-08 03:11:19

标签: python pandas if-statement

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

使用下面的代码,特定值将在normaldifferent之内。 place中的值将决定df的子集。

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

我希望返回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

print(df1)

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

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

2 个答案:

答案 0 :(得分:1)

要检查某个对象是否在某事物中,而不是检查它是否等于某事物,请使用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))

答案 1 :(得分:0)

查看代码中的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'是多余的,因为期间是唯一的 列。

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

另一个细节:如果您的 DataFrame 包含单个列, 也许系列就足够了吗?