Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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_Dataframe - Fatal编程技术网

Python 从不同长度的多个列表中复制长格式数据帧

Python 从不同长度的多个列表中复制长格式数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有多个列表 A = [1, 2, 3] B = [1, 4] 我想生成一个长格式的熊猫数据帧,如下所示: type | value ------------ A | 1 A | 2 A | 3 B | 1 B | 4 最简单的方法是什么?由于列表可能具有不同的长度,因此不可能使用宽格式和melt(?)的方法。为类型创建字典,并通过列表理解创建元组列表: A = [1, 2, 3] B = [1, 4] d = {'A':A,'B':B} print (

假设我有多个列表

A = [1, 2, 3]
B = [1, 4]
我想生成一个长格式的熊猫数据帧,如下所示:

type | value
------------
A    | 1
A    | 2
A    | 3
B    | 1
B    | 4

最简单的方法是什么?由于列表可能具有不同的长度,因此不可能使用宽格式和melt(?)的方法。

类型创建字典,并通过列表理解创建元组列表:

A = [1, 2, 3]
B = [1, 4]

d = {'A':A,'B':B}

print ([(k, y) for k, v in d.items() for y in v])
[('A', 1), ('A', 2), ('A', 3), ('B', 1), ('B', 4)]

df = pd.DataFrame([(k, y) for k, v in d.items() for y in v], columns=['type','value'])
print (df)
  type  value
0    A      1
1    A      2
2    A      3
3    B      1
4    B      4
另一种解决方案是,如果输入是列表列表列表,并且
type
s应该是整数:

L = [A,B]
df = pd.DataFrame([(k, y) for k, v in enumerate(L) for y in v], columns=['type','value'])
print (df)
   type  value
0     0      1
1     0      2
2     0      3
3     1      1
4     1      4

检查这一点,这借鉴了dplyr、tidyr、R编程语言的第三个库的思想,下面的代码只是为了演示,所以我创建了两个df:df1、df2,您可以动态创建dfs和concat:

import pandas as pd


def gather(df, key, value, cols):
    id_vars = [col for col in df.columns if col not in cols]
    id_values = cols
    var_name = key
    value_name = value
    return pd.melt(df, id_vars, id_values, var_name, value_name)


df1 = pd.DataFrame({'A': [1, 2, 3]})

df2 = pd.DataFrame({'B': [1, 4]})

df_messy = pd.concat([df1, df2], axis=1)

print(df_messy)

df_tidy = gather(df_messy, 'type', 'value', df_messy.columns).dropna()

print(df_tidy)
你得到了df_凌乱的输出

   A    B
0  1  1.0
1  2  4.0
2  3  NaN
df_的输出

  type  value
0    A    1.0
1    A    2.0
2    A    3.0
3    B    1.0
4    B    4.0

PS:请记住,要将值的类型从float转换为int类型,我只是写下来演示一下,并没有过多关注细节。

下面是一个使用字典输入的基于NumPy的解决方案:

d = {'A': [1, 2, 3],
     'B': [1, 4]}

keys, values = zip(*d.items())

res = pd.DataFrame({'type': np.repeat(keys, list(map(len, values))),
                    'value': np.concatenate(values)})

print(res)

  type  value
0    A      1
1    A      2
2    A      3
3    B      1
4    B      4