Pandas将列拆分为两个并获得名称后缀

2024-04-26 07:00:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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结尾的序列,但是我得到了这个错误

^{pr2}$

Tags: ofthetolambdadfaddedifnp
2条回答

我要补充的是,您可以使用where方法更高效、更优雅地计算所需的序列:

df['Celsius'] = df.Temp.where(df.Temp > 43)

这是一个矢量化的解决方案,这意味着内部循环是用C实现的。.apply应该避免,因为它使用python循环,速度可能慢得多。另外,lambda函数要尽量避免,因为它们在很多迭代中也会减慢速度。在这些功能性问题中,熊猫的负载。在

问题是,在调用join中动态计算的Series的隐式name属性也将是'Temp',因为它是从该列派生的计算。由于'Temp'已经存在于DataFrame中,因此它引发了一个异常,表示它不知道要使用什么样的名称更改(通过后缀)来防止名称重叠。在

您可以为rsuffix提供一个rsuffix参数,该参数将在名称后附加一个给定的字符串,对于来自联接的操作数的列(在本例中,是函数调用中的操作数)。例如:

df = df.join(df.Temp.apply(lambda x: np.nan if x > 43 else x),
             rsuffix='_Celsius')

在修改后的输出数据帧中获取名为"Temp_Celsius"的列。还有一个选项是使用lsuffix提供一个字符串,如果您希望该列名改为更改,则该字符串将附加到操作数中(或者,如果不希望任何列保留原始名称,则可以同时提供)。在

但是,请注意,在使用join时,您总是忽略任何on参数(联接条件),这意味着您默认按索引“联接”。实际上,您只需要将从旧列派生的新列写入存在中,这样就有机会声明名称,例如:

^{pr2}$

这是更可取的,因为它更清楚地表达了您的意图,即不是加入而是创建一个列。此外,由于默认的join方法是'left',如果碰巧有重复索引,则可能会为左侧索引中的每个重复项连接多次,因为该索引与右侧索引相同(因此也会有重复项),这可能意味着您将在每个连接中无声地错误地引入更多的重复项。在

您还可以选择使用map而不是apply,因为在访问列时,您将使用一个Series对象。在

相关问题 更多 >