繁体   English   中英

如何将两个pandas列混合到一个数据框中,其中第一列的第一个元素,第二列的第二个元素等等?

[英]How to mix two pandas columns into one dataframe with first element from first column, second element from second column and so on?

想象一下我有熊猫数据框:

列 1 列2

A            D

B            E

C            F

如何以这种形式获得结果数据框?

柱子

 A
 D
 B
 E
 C
 F

编辑:请参阅下面的基准以获取稍快的解决方案。

你可以这样做:

# Import pandas library 
import pandas as pd

# The data
data = [["A", "D"], ["B", "E"], ["C", "F"]]

# Create DataFrame
df = pd.DataFrame(data, columns = ["Column1", "Column2"]) 

# Flatten and convert to DataFrame
new_df = pd.DataFrame(df.to_numpy().flatten())

print(df)

输出:

A
D
B
E
C
F

new_df将是一个pandas.DataFrame

请注意df.to_numpy()的使用。

正如@Michael Szczesny 所建议的,你可以这样做:

new_series = df.stack().reset_index(drop=True)

这将返回一个pandas.Series

添加的基准:

根据@Mayank Porwal 的回答,我添加了此基准测试结果。 我将 timeit.repeat 与repeat = 7, number = 10000 从最快到最慢排序:

new_df = pd.DataFrame(df.to_numpy().ravel('A')) # 51.0 µs
new_df = pd.DataFrame(df.to_numpy().ravel('K')) # 51.0 µs
new_df = pd.DataFrame(df.to_numpy().ravel('F')) # 51.1 µs
new_df = pd.DataFrame(df.to_numpy().flatten())  # 52.6 µs
new_df = pd.DataFrame(df.to_numpy().ravel('C')) # 53.4 µs
new_series = df.stack().reset_index(drop=True)  # 322.0 µs

使用numpy.ravel是最快的,主要是因为它返回一个视图,而numpy..to_numpy()返回一个副本。 有关numpy.ravel详细信息,请参阅: https : numpy.ravel

简而言之,如果数组在内存中是 Fortran 连续的,则“A”将强制以类似于 Fortran 的索引顺序读取元素,而“K”将按照它们在内存中出现的顺序读取元素。

df.to_numpynumpy.ravel df.to_numpy使用:

In [2349]: x = pd.DataFrame(df.to_numpy().ravel('F'))

In [2350]: x
Out[2350]: 
     0
0    A
1    B
2    C
3    D
4    E
5    F
dtype: object

注意:这将非常高效。

时序比较:

In [2369]: dd = pd.concat([df] * 1000)

# Rivers' answers:

In [2369]: %timeit pd.DataFrame(dd.to_numpy().flatten())
95.6 µs ± 1.55 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [2371]: %timeit dd.stack().reset_index(drop=True)
919 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# My answer:

In [2372]: %timeit pd.DataFrame(dd.to_numpy().ravel('F'))
62 µs ± 577 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM