在 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%
【讨论】:
这个答案不起作用。因为,Number
是 list of lists
。首先,我们必须将这个列表按[item for sublist in Number for item in sublist]
展平。完成此操作后,我们可以使用您的代码以上是关于在 python/pandas 中有效地压缩多个列表的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas - 具有不同列的 Concat 数据框忽略列名