在 python/pandas 中有效地压缩多个列表

Posted

技术标签:

【中文标题】在 python/pandas 中有效地压缩多个列表【英文标题】:Efficiently Zip multiple list in python/pandas 【发布时间】:2020-11-21 13:18:16 【问题描述】:

我有以下列表

Number = [[1],[2],[3],[4],[6]]
L1 = ['A','B','C','D','E']
L2 = [100, 55, 315, 68, 23]
L3 = ['18%','105','56%','12%','4%']

我想压缩所有列表并创建一个DataFrame。我使用了下面的代码并成功地做到了。

for n, l1, l2, l3 in zip(Number,L1,L2, L3):
    n.insert(1,l1)
    n.insert(2,l2)
    n.insert(3,l3)

df = pd.DataFrame(Number, columns=['Number','Name', 'Value', 'Score'])
print(df)

+---+--------+------+-------+-------+
|   | Number | Name | Value | Score |
+---+--------+------+-------+-------+
| 0 |    1   |   A  |  100  |  18%  |
+---+--------+------+-------+-------+
| 1 |    2   |   B  |   55  |  105  |
+---+--------+------+-------+-------+
| 2 |    3   |   C  |  315  |  56%  |
+---+--------+------+-------+-------+
| 3 |    4   |   D  |   68  |  12%  |
+---+--------+------+-------+-------+
| 4 |    6   |   E  |   23  |   4%  |
+---+--------+------+-------+-------+

因为本例中只有 4 个列表。我们可以轻松地手动键入for n, l1, l2, l3 in zip(Number,L1,L2, L3): 并键入单独的insert 函数。 现在我的问题是,如果有很多列表(比如 15 个)怎么办?有pythonic 的方法吗?

【问题讨论】:

这能回答你的问题吗? Python: create a pandas data frame from a list 没有。我在询问压缩多个文件的有效方法。以上不同。 在你的问题中提到了关于压缩多个files 的任何内容? 检查主题和最后一段.. 你可以试试pd.DataFrame(zip(np.concatenate(Number),L1,L2,L3)) 【参考方案1】:

我不知道为什么你有Number 是一个列表列表。但是,这可能是您正在寻找的:

Number = [1,2,3,4,6]
L1 = ['A','B','C','D','E']
L2 = [100, 55, 315, 68, 23]
L3 = ['18%','105','56%','12%','4%']

pd.DataFrame(list(zip(Number, L1, L2, L3)), columns=['Number', 'Name', 'Value', 'Score'])

输出:

   Number Name  Value Score
0       1    A    100   18%
1       2    B     55   105
2       3    C    315   56%
3       4    D     68   12%
4       6    E     23    4%

【讨论】:

Number 是列表列表 看来你想把列表展平【参考方案2】:

我肯定会找到一种更恢复的格式来编写这个查询!我的脑海里浮现出这样的想法:

test = [Number, L1, L2, L3]
for t in zip(*test):
    print(t)

# on the first loop iteration:
# t = ([1], 'A', 100, '18%')
#t[3] = ['18%']

您会发现,您的结果现在将位于一个元组中(例如 ([1], 'A', 100, '18%'))。因此,如果您需要访问每个值,例如Number 中的值,你可以做 t[0]。

【讨论】:

Number 是列表列表【参考方案3】:

这符合要求吗?用每个列表的名称和列表本身制作一个字典。然后将字典传递给 DataFrame 构造函数(在下面的打印语句中)。

data = 
    'Number': Number,
    'L1': L1,
    'L2': L2,
    'L3': L3

df = pd.DataFrame(data).rename(columns='L1': 'Name', 
                                        'L2': 'Value', 
                                        'L3': 'Score')
print(df)

   Number Name  Value Score
0       1    A    100   18%
1       2    B     55   105
2       3    C    315   56%
3       4    D     68   12%
4       6    E     23    4%

【讨论】:

这个答案不起作用。因为,Numberlist of lists。首先,我们必须将这个列表按[item for sublist in Number for item in sublist] 展平。完成此操作后,我们可以使用您的代码

以上是关于在 python/pandas 中有效地压缩多个列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 python pandas 在多个列中进行选择?

Python Pandas - 具有不同列的 Concat 数据框忽略列名

在 Oracle 中独立地从多个列中有效地查找前 N 个值

有效地从子查询中选择多个列(放置在 SELECT 线索中)

如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?

python pandas以相同的方式重命名多个列标题