当创建一个新的列,为什么它工作与一个函数,而不是没有它?



我正在使用泰坦尼克号数据集学习清理数据。我要做的是创建一个新列并向其添加值。数据集包含两列,'SibSp'(Sibling &配偶)及'Parch'(父母&儿童)乘客。我创建了一个新的栏目"家庭规模",把它们放在一个地方。

import pandas as pd
import os
filename = os.path.join(os.path.dirname(__file__),'train.csv')
data = pd.read_csv(filename)
#This is without a function
data['Family Size'] = data['SibSp'] + data['Parch']
print(data)
#This is with a Function
def create_fam_size(data):
return data['SibSp'] + data['Parch']
data['Family Size'] = create_fam_size(data)
print(data)

到目前为止一切都很好。现在,我想创建另一个列'Is Alone',用1表示孤独,0表示非孤独。我试着创建一个函数来做这件事,它工作得很好。

def create_is_alone_column(data, colname):
def is_alone(a):
if a == 0:
return 1
else:
return 0
return data[colname].apply(is_alone)
data['Is Alone'] = create_is_alone_column(data, 'Family Size')
print(data)

但是当我尝试在没有函数的情况下这样做时,我得到一个ValueError,并被难住了。

data['Is Alone'] = data['Family Size']
if data['Family Size'] == 0:
data['Is Alone'].apply(0)
else:
data['Is Alone'].apply(1)
print(data)

错误如下:

Traceback (most recent call last):
File "c:/Users/Desktop/tiny.py", line 119, in <module>
if data['Family Size'] == 0:
File "C:UsersAppDataLocalPackagesPythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0LocalCachelocal-packagesPython38site-packagespandascoregeneric.py", line 1439, in __nonzero__
raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我知道我忽视了一些荒谬的事情,所以如果有人能给我一丝希望,我将永远感激。

数据集可以从这里下载,如果你想:https://www.kaggle.com/hesh97/titanicdataset-traincsv

您可以使用:

[...] # "Family Size" is calculated
data["Alone"] = 0
data.loc[data["Family Size"] == 0, "Alone"] = 1

这将基于条件data["Family Size"] == 0创建一个掩码,并将列"Alone"中的所有值设置为1,其中该条件为True

然而,apply不像你使用它的方式工作,参见文档。因为DataFrame.apply(func, ...)func作为输入,并在列(axis=0)或行(axis=1)上执行。

您可以使用numpy:

在一行中完成此操作
data["Alone"] = np.where(data["Family Size"] == 0, 1, 0)

请参阅where docs,其中(condition, x, y)为" where为True, yield x,否则yield y"

最新更新