![](/img/trans.png)
[英]Create a Pandas Dataframe from two lists: column 1 is first list, column 2 is second list which is a nested list
[英]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_numpy
与numpy.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.