[英]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.