簡體   English   中英

將 function 應用於 dataframe 的每一列

[英]Apply a function to each column of a dataframe

我有一個 dataframe 數字從 1 到 13(每個數字都是一個位置)。 作為索引,我設置了一個時間線,表示 24 小時內 2 分鍾的時間步長(720 行)。 每列代表一個人。 所以我在 2 分鍾的時間步長中有 24 小時的位置列。

我正在嘗試將此數字轉換為二進制(如果是 13,我想要 1,否則為 0)。 但是當我嘗試應用 function 時出現錯誤:

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的數字。提前致謝!

正如您在標題中所說,您將 function 應用於數據框的每一列。 所以你所說的 function 中的element實際上是一整列。 這就是if element == 13:行引發錯誤的原因。 Python 不知道整列等於一個數字意味着什么。 一個直接的解決方案是使用 for 循環:

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

但是,這仍然不能解決更基本的問題,即 function 實際上並沒有改變任何具有持久效果的東西,因為它只使用局部變量。

一種簡單的替代方法是使用 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:]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM