将pandas数据帧中的两列按特定顺序合并



例如,我有一个数据帧,其中两列是";零;以及";Ones";分别只包含零和一。如果我把它们组合成一列,我首先得到所有的零,然后得到所有的一。

我想将它们组合在一起,这样我就可以从两列中获得每个元素,而不是从第一列中获得所有元素,从第二列获得所有元素。所以我不希望结果是[0,0,0,1,1,1],我需要它是[0。

我处理100K行以上的数据。实现这一目标的最快或最佳方式是什么?提前感谢!

尝试:

import pandas as pd
df = pd.DataFrame({ "zeroes" : [0, 0, 0], "ones":  [1, 1, 1], "some_other" : list("abc")})
res = df[["zeroes", "ones"]].to_numpy().ravel(order="C")
print(res)

输出

[0 1 0 1 0 1]

微观基准

import pandas as pd
from itertools import chain
df = pd.DataFrame({ "zeroes" : [0] * 10_000, "ones":  [1] * 10_000})
%timeit df[["zeroes", "ones"]].to_numpy().ravel(order="C").tolist()
672 µs ± 8.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [v for vs in zip(df["zeroes"], df["ones"]) for v in vs]
2.57 ms ± 54 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit list(chain.from_iterable(zip(df["zeroes"], df["ones"]))) 
2.11 ms ± 73 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

您可以使用numpy.flatten()作为替代:

import numpy as np
import pandas as pd
df[["zeroes", "ones"]].to_numpy().flatten()

基准(在colab上运行(:

df = pd.DataFrame({ "zeroes" : [0] * 10_000_000, "ones":  [1] * 10_000_000})
%timeit df[["zeroes", "ones"]].to_numpy().flatten().tolist()
1 loop, best of 5: 320 ms per loop
%timeit df[["zeroes", "ones"]].to_numpy().ravel(order="C").tolist()
1 loop, best of 5: 322 ms per loop

我不知道这是否是最理想的解决方案,但它应该能解决您的问题。

df = pd.DataFrame([[0 for x in range(10)], [1 for x in range(10)]]).T
l = [[x, y] for x, y in zip(df[0], df[1])]
l = [x for y in l for x in y]
l

这可能会帮助您:使用Pandas 替换不同列的元素

pd.concat(
[df1, df2], axis=1
).stack().reset_index(1, drop=True).to_frame('C').rename(index='CC{}'.format)

最新更新