将功能应用于数据框的每一列

时间:2020-05-11 09:31:05

标签: pandas dataframe

我有一个从1到13的数字数据框(每个数字是一个位置)。作为索引,我设置了一个时间轴,以表示24小时(720行)中2分钟的时间步长。每列代表一个人。因此,我有2分钟的时间沿24小时提供位置列。

我正在尝试将此数字转换为二进制(如果它是13,我想要1,否则是0)。但是当我尝试应用该功能时,出现错误:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是代码:

import pandas as pd
from datetime import timedelta
df = pd.read_csv("dataset_belgium/all_patterns_2MINS.csv", encoding="utf-8")
df = df.transpose()

df.reset_index(drop=True, inplace=True)


timeline = []
for timestep in range(len(df.index)):
    time = timedelta(seconds=timestep*2*60)
    time = str(time)
    timeline.append(time)


tl = pd.DataFrame(timeline)
tl.columns = ['timeline']

df=df.join(tl, how='left')

df = df.set_index('timeline')
#df.drop(['0:00:00'])

def to_binary(element):
    if element == 13:
        element = 1
    else:
        element = 0
    return element

binary_df = df.apply(to_binary)

我还要删除第一行,即索引('0:00:00')的第一行,因为它不包含从1到13的数字。 预先感谢!

1 个答案:

答案 0 :(得分:0)

正如标题中所述,您可以将该函数应用于数据框的每一列。因此,您在函数内调用的element实际上是一整列。这就是if element == 13:行引发错误的原因。 Python不知道整列等于一个数字意味着什么。一种简单的解决方案是使用for循环:

def to_binary(column):
    for element in column:
        if element == 13:
            element = 1
        else:
            element = 0
    return column

但是,这仍然无法解决更基本的问题,因为该函数仅使用局部变量,因此实际上并不会产生任何持久影响。

一种简单的替代方法是使用pandas replace方法,该方法允许您将任意值显式替换为其他值:

df.replace([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
           [0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  1], 
           inplace=True)

要删除第一行,可以使用df = df[1:]