我正在使用泰坦尼克号数据集学习清理数据。我要做的是创建一个新列并向其添加值。数据集包含两列,'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"