Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何将值中包含列表的数据帧转换为每个级别都作为单个列值的大数据帧?_Python_Pandas - Fatal编程技术网

在python中,如何将值中包含列表的数据帧转换为每个级别都作为单个列值的大数据帧?

在python中,如何将值中包含列表的数据帧转换为每个级别都作为单个列值的大数据帧?,python,pandas,Python,Pandas,我有一个如下所示的数据框: mydata = [{'col_A' : 'A', 'col_B': [1,2,3]}, {'col_A' : 'B', 'col_B': [7,8]}] pd.DataFrame(mydata) col_A col_B A [1, 2, 3] B [7, 8] 如何拆分列表中的值并创建如下所示的数据框: col_A col_B A 1 A 2 A 3 B 7 B 8 试试这个: pd.DataF

我有一个如下所示的数据框:

mydata = [{'col_A' : 'A', 'col_B': [1,2,3]},
      {'col_A' : 'B', 'col_B': [7,8]}]
pd.DataFrame(mydata)


col_A   col_B
    A   [1, 2, 3]
    B   [7, 8]
如何拆分列表中的值并创建如下所示的数据框:

col_A   col_B
A   1
A   2
A   3
B   7
B   8
试试这个:

pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} 
               for ind, row in df.iterrows()
               for val in row['col_B']])

您可能还可以使用apply()函数做一些聪明的事情,但在我脑海中,我可以想到如何做。

这里有一个使用
apply
的解决方案:

df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index(level=0)

  col_A  0
0     A  1
1     A  2
2     A  3
3     B  7
4     B  8

如果您的
DataFrame
很大,最快的方法是使用
DataFrame构造函数
和双精度:

测试

import pandas as pd

mydata = [{'col_A' : 'A', 'col_B': [1,2,3]},
      {'col_A' : 'B', 'col_B': [7,8]}]
df = pd.DataFrame(mydata)

print df


df =  pd.concat([df]*1000).reset_index(drop=True)

print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})

print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})

print df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})

print pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
In [1657]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
100 loops, best of 3: 4.01 ms per loop

In [1658]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})
100 loops, best of 3: 3.09 ms per loop

In [1659]: %timeit pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
10 loops, best of 3: 153 ms per loop

In [1660]: %timeit df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
1 loops, best of 3: 357 ms per loop
定时

import pandas as pd

mydata = [{'col_A' : 'A', 'col_B': [1,2,3]},
      {'col_A' : 'B', 'col_B': [7,8]}]
df = pd.DataFrame(mydata)

print df


df =  pd.concat([df]*1000).reset_index(drop=True)

print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})

print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})

print df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})

print pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
In [1657]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
100 loops, best of 3: 4.01 ms per loop

In [1658]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})
100 loops, best of 3: 3.09 ms per loop

In [1659]: %timeit pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
10 loops, best of 3: 153 ms per loop

In [1660]: %timeit df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
1 loops, best of 3: 357 ms per loop

请考虑下面一个有效的答案来结束话题。