Python 如何将两列数据混合到一个数据帧中,第一列的第一个元素、第二列的第二个元素等等?
假设我有熊猫数据帧: 第1列第2列Python 如何将两列数据混合到一个数据帧中,第一列的第一个元素、第二列的第二个元素等等?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,假设我有熊猫数据帧: 第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", &q
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
注意too的用法
根据@Michael Szczesny的建议,您可以:
new_series = df.stack().reset_index(drop=True)
它将返回一个pandas.Series
添加的基准测试:
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)
根据@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\u numpy()
返回一个副本。
有关numpy.ravel
的详细信息,请参阅:
简言之,如果数组在内存中是Fortran连续的,“A”将强制以类似Fortran的索引顺序读取元素,使用“K”将按照元素在内存中出现的顺序读取元素。与以下一起使用:
注意:这将非常有效。
时间比较:
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)
起始数据框中是否有空行?没有,全部已填充。
df.stack().reset\u index(drop=True)
您是否尝试过df.values.flatte()然后对其进行整形?它返回一个numpy数组,但如果需要,可以将其转换回数据帧。相关答案:完美@MichaelSzczesny,是的working@Augustas请核对我的答案。它有最好的性能。我没想到速度性能对这个任务很重要,好主意,谢谢,我会编辑我的答案。