我有一个大型数据框,其中包含许多列,但是我只看一列。
此示例是为了简化。我定义了一个新列col2,如果满足第一列的条件,它将存储一个布尔值。
raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
df = pd.DataFrame(raw_data, columns = ['col1'])
df
df['col2'] = 'default'
df
col1 col2
row1 [2,3,44,89.6,...] default
row2 [10,4,33.3,1.11,...] default
我需要对col1进行一些计算,如果满足某些条件,则在同一行的col2中的默认值为True,否则为False。
简化的计算
计算列表中的最大值,列表的长度和平均值。
我在一个函数中进行这些计算,然后介绍另一个尝试执行评估部分的函数。
例如,如果最大值> 10,并且列表长度> 5,并且平均值> 25,则使col2中的默认值为True。
我相信我必须使用.apply()函数。
df['col2'] = df.apply (lambda row: my_functions (row),axis=1)
必需的输出
col1 col2
row1 [2,3,44,89.6,...] True
row2 [10,4,33.3,1.11,...] False
我很困在这里,因为我不知道如何进行一些计算并遍历整个列并评估这些计算。
谢谢!
答案 0 :(得分:0)
有几种方法可以执行此操作,但是您无需在进行计算之前设置col2
。您可以在apply
属性中放入您选择的功能。只需记住,使用apply
到函数的输入是一行一行。
raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
df = pd.DataFrame(raw_data, columns = ['col1'])
# if max(list) > 10 --> True
def my_function (row):
if max(row['col1'])>10:
row = True
else:
row = False
return row
df['col2'] = df.apply(my_function, axis =1)
df
col1 col2
0 [0, 2, 3, 4] False
1 [6, 7, 1000, 40, 20] True
2 [4, 20, 100] True
答案 1 :(得分:0)
这是一种方法:
raw_data = {'col1': [[0, 2, 3, 4], [6, 7, 1000, 40, 20, 13], [4, 20, 100]]}
df = pd.DataFrame(raw_data, columns=['col1'])
def my_functions(r):
nb = len(r.col1)
average = sum(r.col1) / nb
maxl = max(r.col1)
return maxl > 10 and len(r.col1) > 5 and average > 25
df['col2'] = df.apply(lambda row: my_functions(row), axis=1)
print(df)
输出:
col1 col2
0 [0, 2, 3, 4] False
1 [6, 7, 1000, 40, 20, 13] True
2 [4, 20, 100] False
答案 2 :(得分:0)
如果数据框较大,则可以使用矢量化函数:
def my_func(l):
return (max(l) > 10) and (len(l) > 5) and (np.mean(l) > 25)
my_func = np.vectorize(my_func)
df['col2'] = my_func(df['col1'].values)
输出:
col1 col2
[0, 2, 3, 4] False
[6, 7, 1000, 40, 20, 13] True
[4, 20, 100] False