我需要编写一个程序,通过获取行的子集并检查它们的列来确定分类值来分析数据帧。
所有数据都在一个数据框中。需要表征每个“批次”中的“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)```