关于python:使用Pandas向字符串列中的每个值添加字符串前缀 |
您所在的位置:网站首页 › 每个单元格前面加同一个字符 › 关于python:使用Pandas向字符串列中的每个值添加字符串前缀 |
我想在熊猫数据帧的所述列中的每个值的开头附加一个字符串(优雅)。 我已经弄清楚该如何做,目前正在使用: 1df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']这似乎是一件微不足道的事情-您是否知道其他方法(也可能将字符添加到该列为0或NaN的行中)? 如果还不清楚,我想转一下: 123 col 1 a 2 0变成: 123 col 1 stra 2 str0 相关讨论 你到底在问什么 请就您的代码做什么/希望它做一个解释 我认为示例代码对普通的熊猫用户来说非常清楚。 为了方便起见,我添加了用例示例。 您的描述与您的代码有些矛盾。 != False业务如何? 您要将str添加到每个值还是仅添加一些值? 如我的示例数据框所示。 您的示例仍然不清楚,您是否想要类似df[col] = str + df[col].astype(str)的东西? 大! 那正是我想要的。 您可以将其写下来作为答案。 1df['col'] = 'str' + df['col'].astype(str)例: 12345678910>>> df = pd.DataFrame({'col':['a',0]}) >>> df col 0 a 1 0 >>> df['col'] = 'str' + df['col'].astype(str) >>> df col 0 stra 1 str0 相关讨论 谢谢。如果有兴趣,数据帧索引也支持这种字符串操作。 如果必须在连接之前满足条件,该怎么办? @ tagoma,4年后,是的:它也支持数据框索引。您可以创建一个新列并将其附加到索引值上,如下所示:df [col] = str + df.index.astype(str) 如果最后尝试保存到文件,则" astype(str)"可能会破坏编码。 当我尝试此方法以及其他任何方法时,都会看到SettingWithCopyWarning。有办法避免吗?作为替代方案,您还可以将apply与format组合使用(或者更好地使用f字符串),如果例如还想添加一个后缀或操纵元素本身: 123df = pd.DataFrame({'col':['a', 0]}) df['col'] = df['col'].apply(lambda x:"{}{}".format('str', x))这也会产生所需的输出: 123 col 0 stra 1 str0如果您使用的是Python 3.6+,则还可以使用f字符串: 1df['col'] = df['col'].apply(lambda x: f"str{x}")产生相同的输出。 f字符串版本几乎与@RomanPekar的解决方案(python 3.6.4)一样快: 1234567df = pd.DataFrame({'col':['a', 0]*200000}) %timeit df['col'].apply(lambda x: f"str{x}") 117 ms ± 451 μs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit 'str' + df['col'].astype(str) 112 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)但是,使用format确实要慢得多: 12%timeit df['col'].apply(lambda x:"{}{}".format('str', x)) 185 ms ± 1.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 相关讨论 同样的结果,但是速度更慢;-) @Philipp_Kats:我添加了一些时间,感谢您的建议!看来f弦几乎一样快。 format确实表现较差。您如何比较? 不错哦!在我的理解中,.apply总是比"直接"矢量化操作快或慢。即使它们并不慢,我还是希望尽可能避免它们。 @Philipp_Kats:但是,我同意,在这种特殊情况下,当我还添加一个后缀,使用x本身做某事等时,我觉得它更具可读性,但这仅是一个口味问题... :)您可以使用pandas.Series.map: 1df['col'].map('str{}'.format)它将在所有值之前加上" str"一词。 如果使用dtype=str加载表文件 或将列类型转换为字符串df['a'] = df['a'].astype(str) 那么您可以使用这种方法: 1df['a']= 'col' + df['a'].str[:]这种方法允许df的前缀,附加和子集字符串。 适用于Pandas v0.23.4,v0.24.1。不了解较早的版本。 .loc的另一种解决方案: 12df = pd.DataFrame({'col': ['a', 0]}) df.loc[df.index, 'col'] = 'string' + df['col'].astype(str)这没有上述解决方案快(每个循环慢> 1ms),但是在需要条件更改时可能有用,例如: 12mask = (df['col'] == 0) df.loc[mask, 'col'] = 'string' + df['col'].astype(str) 相关讨论 为什么在df[mask].index中使用.index? @AMC,因为对于.loc,您需要数据帧的索引。这意味着-df [mask]返回符合条件的数据帧,而df [mask] .index返回该数据帧的索引。但是,确实可以使用df.loc [(df [col] == a),col]或df.loc [mask,col]进行相同操作。 因为对于.loc,您需要数据帧的索引。如果df.loc[mask]有效且确实有效,则.index是多余的,对吗? @AMC完全是:)。香港专业教育学院编辑解决方案。谢谢。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |