def madd(x):
"""Performs element-wise string concatenation with multiple input arrays.
Args:
x: iterable of np.array.
Returns: np.array.
"""
for i, arr in enumerate(x):
if type(arr.item(0)) is not str:
x[i] = x[i].astype(str)
return reduce(np.core.defchararray.add, x)
例如:
data = list(zip([2000]*4, ['q1', 'q2', 'q3', 'q4']))
df = pd.DataFrame(data=data, columns=['Year', 'quarter'])
df['period'] = madd([df[col].values for col in ['Year', 'quarter']])
df
Year quarter period
0 2000 q1 2000q1
1 2000 q2 2000q2
2 2000 q3 2000q3
3 2000 q4 2000q4
# be cautious about the separator, some symbols may cause "SyntaxError: EOL while scanning string literal".
# e.g. ";;" as separator would raise the SyntaxError
separator = "&&"
# pd.Series.str.cat() method does not work to concatenate / combine two columns with int value and str value. This would raise "AttributeError: Can only use .cat accessor with a 'category' dtype"
df["period"] = df["Year"].map(str) + separator + df["quarter"]
df["period"] = df[['Year','quarter']].apply(lambda x : '{} && {}'.format(x[0],x[1]), axis=1)
df["period"] = df.apply(lambda x: f'{x["Year"]} && {x["quarter"]}', axis=1)
import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
In [131]: %timeit df["Year"].map(str)
10000 loops, best of 3: 132 us per loop
In [132]: %timeit df["Year"].astype(str)
10000 loops, best of 3: 82.2 us per loop
19条答案
按热度按时间ss2ws0br1#
可以使用dataframe的分配方法:
ikfrs5lh2#
例如:
hmmo2u0o3#
使用
.combine_first
.zaq34kh64#
正如前面提到的,您必须将每个列转换为字符串,然后使用加号运算符组合两个字符串列。通过使用numpy,您可以获得很大的性能改进。
ruoxqz4g5#
我的看法。。。。
wydwbb8l6#
下面是我对上述解决方案的总结,使用列值之间的分隔符,将两个具有int和str值的列连接/组合到一个新列中。为此,有三种解决方案。
jm2pwxwz7#
更有效的是
下面是一个时间测试:
最后,什么时候
sum
使用(concat_df_str2),结果不仅仅是concat,它将转换为整数。yizd12fk8#
此解决方案使用一个中间步骤,将 Dataframe 的两列压缩为包含值列表的一列。这不仅适用于字符串,而且适用于所有类型的列数据类型
结果:
0mkxixxg9#
使用
zip
可能会更快:图表:
d6kp6zgx10#
您可以使用lambda:
然后将其用于创建新列:
a5g8bdjr11#
如果两列都是字符串,则可以直接连接它们:
如果其中一列(或两列)不是字符串类型,则应首先转换该列,
做这件事时要当心南斯!
如果需要连接多个字符串列,可以使用
agg
:其中“-”是分隔符。
yi0zb3m412#
以下是一个我认为非常通用的实现:
weylhg0b13#
让我们假设你的
dataframe
是df
带柱Year
及Quarter
.假设我们想要看到 Dataframe ;
最后,连接
Year
和Quarter
具体如下。你现在可以
print
df
查看生成的 Dataframe 。如果你不想要年和季度之间的空间,只需通过这样做来移除它;
qacovj5a14#
尽管@silvado的答案是好的,如果你改变
df.map(str)
到df.astype(str)
它将更快:2hh7jdfx15#
概括到多个列,为什么不: