我是Pandas和Numpy的新手。我有一个数据框,我想通过将一个函数应用于列的每一行来创建一个新列。我们举一个简单的例子:
import pandas as pd
import numpy as np
df = pd.DataFrame(columns=["names"], data=["Brussels", 2, "New York"])
def to_lower(value):
try:
return value.lower()
except AttributeError:
return None
def to_string(value):
return str(value)
df['lower_names'] = np.vectorize(to_lower)(df['names'])
此操作非常有效。现在我想将to_string()
然后to_lower()
仅应用于" lower_names"结果是无(我不知道这是否非常清楚)。
这看起来很基本,但我遇到了麻烦。我可以详细说明我的尝试,但我害怕出现一个白痴...也许我应该花一两个星期学习这两个模块然后再玩它们,但与此同时,任何建议都会受到欢迎。
编辑:@jezrael解决方案是正确的......对于我的简化示例。现在让我们想象一下,我想要将np.vectorize(to_string)
函数应用于np.vectorize(to_lower)
,然后StanzaFilter subscribefilter = PresenceTypeFilter.SUBSCRIBE;
PresenceSubscribeListener subscribeListener = new PresenceSubscribeListener(context.getApplicationContext(), connection);
connection.addSyncStanzaListener(subscribeListener, subscribefilter);
仅应用于列的行和#34;名称"第一个结果是None,最好的方法是什么?
答案 0 :(得分:2)
我认为您需要将return None
更改为return to_string(value)
:
def to_lower(value):
try:
return value.lower()
except AttributeError:
return to_string(value)
def to_string(value):
return str(value)
df['lower_names'] = np.vectorize(to_lower)(df['names'])
print (df['lower_names'].apply(type))
0 <class 'str'>
1 <class 'str'>
2 <class 'str'>
Name: lower_names, dtype: object
也可以使用astype
将所有值转换为str
,然后转换为str.lower
:
df['lower_names'] = df['names'].astype(str).str.lower()