分析多个数据框列以创建新的分类变量?

时间:2021-04-20 17:11:03

标签: python pandas dataframe

我需要编写一个程序,通过获取行的子集并检查它们的列来确定分类值来分析数据帧。

所有数据都在一个数据框中。需要表征每个“批次”中的“var1”和“var2”:

if var1 == 'white' and var2 == 'one' then 'L1'
if var1 == 'white' and var2 == 'two' then 'L2'
if var1 == 'blue' and var2 == 'one' then 'L3'
if var1 == 'blue' and var2 == 'two' then 'L4'

新的“分类”变量(“L1”、“L2”、“L3”、“L4”)与“批次”中的第一个日期组合在一个数组中。最终所有的数组都被收集到一个新的数据帧中。我认为组合成一个新数组是可选的。新的分类值可能是一个新的数据框列,我在第二步中获取日期。

我最终编写了一个复杂的循环来执行分析。它有效,但我想知道是否有更“python”的方式来执行相同的任务。

这是完成我的任务的工作示例代码:

import pandas as pd
import datetime

col = ['fruit', 'batch', 'dtm', 'var1','var2']

data = [
        ['apple', 1, datetime.datetime(2020,1,1,0,0,0), 'white', 'two'],
        ['apple', 1, datetime.datetime(2020,2,1,0,0,0), 'blue', 'one'],
        ['apple', 1, datetime.datetime(2020,2,1,0,0,0), 'blue', 'one'],
        ['apple', 2, datetime.datetime(2020,2,1,0,0,0), 'blue', 'two'],
        ['apple', 2, datetime.datetime(2020,3,1,0,0,0), 'blue', 'one'],
        ['orange',3, datetime.datetime(2020,1,1,0,0,0), 'white', 'one'],
        ['orange',3, datetime.datetime(2020,3,1,0,0,0), 'white', 'two'],
    ['apple', 4, datetime.datetime(2020, 2, 1, 0, 0, 0), 'blue', 'one'],
    ['apple', 4, datetime.datetime(2020, 3, 1, 0, 0, 0), 'blue', 'one'],
    ['orange', 5, datetime.datetime(2020, 1, 1, 0, 0, 0), 'white', 'two'],
    ['orange', 5, datetime.datetime(2020, 3, 1, 0, 0, 0), 'white', 'two'],
    ['orange', 6, datetime.datetime(2020, 3, 1, 0, 0, 0), 'white', 'two'],
    ['orange', 6, datetime.datetime(2020, 3, 3, 0, 0, 0), 'white', 'two'],
        ]
df = pd.DataFrame(data, columns = col)

df.set_index(['fruit', 'batch'], inplace = True)

header_list = ['categorical', 'first_dtm']
data_list = []

data_list = []

for fruit, new_df in df.groupby(level=1):
    if new_df['var1'].str.contains('white').sum() > 0:
        if new_df['var2'].str.contains('one').sum() > 0:
            data_list.append(['L1',new_df['dtm'][0]])
        else:
            data_list.append(['L2', new_df['dtm'][0]])
    else:
        if new_df['var2'].str.contains('one').sum() > 0:
            data_list.append(['L3', new_df['dtm'][0]])
        else:
            data_list.append(['L4', new_df['dtm'][0]])

df_out = pd.DataFrame(data_list,columns=header_list)```

0 个答案:

没有答案