我有一个pandas数据框,其中一列是温度(人类),但是值是混合的,摄氏度和华氏度,我想把这个列分成两列(保留原来的一列)
#C Temp will be added to the end of df
df = df.join(df.Temp.apply(lambda x: np.nan if x > 43 else x))
#F Temp will be added to the end of df
df = df.join(df.Temp.apply(lambda x: np.nan if x < 43 else x))
我原以为df.Temp.apply(lambda x: np.nan if x < 43 else x)
将返回一个将连接到df
结尾的序列,但是我得到了这个错误
我要补充的是,您可以使用
where
方法更高效、更优雅地计算所需的序列:这是一个矢量化的解决方案,这意味着内部循环是用C实现的。
.apply
应该避免,因为它使用python循环,速度可能慢得多。另外,lambda
函数要尽量避免,因为它们在很多迭代中也会减慢速度。在这些功能性问题中,熊猫的负载。在问题是,在调用
join
中动态计算的Series
的隐式name
属性也将是'Temp'
,因为它是从该列派生的计算。由于'Temp'
已经存在于DataFrame中,因此它引发了一个异常,表示它不知道要使用什么样的名称更改(通过后缀)来防止名称重叠。在您可以为
rsuffix
提供一个rsuffix
参数,该参数将在名称后附加一个给定的字符串,对于来自联接的右操作数的列(在本例中,是函数调用中的操作数)。例如:在修改后的输出数据帧中获取名为
"Temp_Celsius"
的列。还有一个选项是使用lsuffix
提供一个字符串,如果您希望该列名改为更改,则该字符串将附加到左操作数中(或者,如果不希望任何列保留原始名称,则可以同时提供和)。在但是,请注意,在使用
^{pr2}$join
时,您总是忽略任何on
参数(联接条件),这意味着您默认按索引“联接”。实际上,您只需要将从旧列派生的新列写入存在中,这样就有机会声明名称,例如:这是更可取的,因为它更清楚地表达了您的意图,即不是加入而是创建一个列。此外,由于默认的join方法是
'left'
,如果碰巧有重复索引,则可能会为左侧索引中的每个重复项连接多次,因为该索引与右侧索引相同(因此也会有重复项),这可能意味着您将在每个连接中无声地错误地引入更多的重复项。在您还可以选择使用
map
而不是apply
,因为在访问列时,您将使用一个Series对象。在相关问题 更多 >
编程相关推荐