如何将两个熊猫列混合到一个数据框中,第一列的第一个元素,第二列的第二个元素等等? [复制]

Posted

技术标签:

【中文标题】如何将两个熊猫列混合到一个数据框中,第一列的第一个元素,第二列的第二个元素等等? [复制]【英文标题】:How to mix two pandas columns into one dataframe with first element from first column, second element from second column and so on? [duplicate] 【发布时间】:2021-02-28 18:00:00 【问题描述】:

想象一下我有 pandas 数据框:

Column1 Column2

A            D

B            E

C            F

如何获得这种形式的Dataframe?

 A
 D
 B
 E
 C
 F

【问题讨论】:

您的起始数据框中是否有空行? 不,都填满了。 df.stack().reset_index(drop=True) 您尝试过 df.values.flatten() 然后对其进行整形吗?它返回一个 numpy 数组,但如果需要,您可以将其转换回数据框。相关答案在这里:***.com/questions/25440008/… 完美@MichaelSzczesny,它正在工作 【参考方案1】:

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

你可以这样做:

# 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://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ravel.html

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

【讨论】:

【参考方案2】:

df.to_numpynumpy.ravel 一起使用:

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)

【讨论】:

@Augustas 请检查我的答案。它的性能最好。 我不认为速度性能对这项任务很重要,好主意,谢谢,我会编辑我的答案。

以上是关于如何将两个熊猫列混合到一个数据框中,第一列的第一个元素,第二列的第二个元素等等? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏显示序列号的熊猫数据框中的第一列[重复]

为排序的熊猫数据框中的每个 ID 选择特定列的第一个值

如何在熊猫数据框中查找列的 ngram 频率?

从混合字母和数字列熊猫中提取日期时间

如何使用熊猫复制行(列)的元素并粘贴到csv中的第1行(另一列)?

遍历熊猫数据框中的列