首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在每次迭代中填充多个变量

在每次迭代中填充多个变量
EN

Stack Overflow用户
提问于 2022-03-09 20:52:33
回答 5查看 63关注 0票数 0

我有许多变量,我的意图是在多次迭代中填充每个变量,而每个变量都需要一个不同的表达式来提取它们的值。与我所要做的大致相当的是下面的for循环。

代码语言:javascript
复制
pairs = {('Ams', 'Rot') : 10, ('Del', 'Utr') : 12, ('Ams', 'Utr') : 14, ('Del', 'Rot') : 16}

var_1 = []
var_2 = []
var_3 = []
var_4 = []

for i in range(3):
    for (j, k) in pairs:
        var_1.append(i)
        var_2.append(j)
        var_3.append(k)
        var_4.append(pairs[(j, k)])

df = {'Var_1' : var_1, 'Var_2' : var_2, 'Var_3' : var_3, 'Var_4' : var_4}
df = pd.DataFrame(df)
print(df)

我想要的输出:

代码语言:javascript
复制
    Var_1 Var_2 Var_3  Var_4
0       0   Ams   Rot     10
1       0   Del   Utr     12
2       0   Ams   Utr     14
3       0   Del   Rot     16
4       1   Ams   Rot     10
5       1   Del   Utr     12
6       1   Ams   Utr     14
7       1   Del   Rot     16
8       2   Ams   Rot     10
9       2   Del   Utr     12
10      2   Ams   Utr     14
11      2   Del   Rot     16

但是,我很想知道是否有一种更有效的方法,特别是在pandas中。最后,我想创建一个熊猫DataFrame的以下字典。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-03-09 21:40:02

您可以使用基于索引的解决方案:

由于您有一个dict,使用数据是值和索引创建一个数据have是关键。在您的例子中,您有元组键,所以使用索引将是一个pd.MultiIndex。此时,您有Var_2Var_3Var_4

棘手的部分是从这个数据文件生成Var_1。重复索引3次,并重新索引数据。所有的值都是重复的。所以你有3x (Ams,Rot,10),3x (Del,Utr,12)等等。现在,如果将重复的行组合在一起,则可以使用cumcount创建ID (0 ->第一实例、1 ->第二实例、.)。最后,根据索引(Var_1)对数据进行排序,并将其重置以获得预期的结果。

代码语言:javascript
复制
# Part 1: create Var_2, Var_3 and Var_4
mi = pd.MultiIndex.from_tuples(pairs.keys(), names=['Var_2', 'Var_3'])
df = pd.DataFrame({'Var_4': pairs.values()}, index=mi).reset_index()

# Part 2: create Var_1
df = df.reindex(df.index.repeat(3))
df = df.set_index(df.groupby(df.columns.tolist()).cumcount().rename('Var_1')) \
       .sort_index().reset_index()

输出:

代码语言:javascript
复制
>>> df
    Var_1 Var_2 Var_3  Var_4
0       0   Ams   Rot     10
1       0   Del   Utr     12
2       0   Ams   Utr     14
3       0   Del   Rot     16
4       1   Ams   Rot     10
5       1   Del   Utr     12
6       1   Ams   Utr     14
7       1   Del   Rot     16
8       2   Ams   Rot     10
9       2   Del   Utr     12
10      2   Ams   Utr     14
11      2   Del   Rot     16
票数 1
EN

Stack Overflow用户

发布于 2022-03-09 20:54:44

您可以使用dict-comprehension轻松地设置

代码语言:javascript
复制
names = ['var_1', 'var_2', 'var_3', 'var_4']
values = {n: range(3) for n in names}
df = pd.DataFrame(values)
代码语言:javascript
复制
   var_1  var_2  var_3  var_4
0      0      0      0      0
1      1      1      1      1
2      2      2      2      2

但是用相同的列创建一个数据格式有点奇怪,因为它没有太多的信息

票数 1
EN

Stack Overflow用户

发布于 2022-03-09 21:33:38

我们还可以用pairs创建一个pairs(这将创建一个包含一行和MultiIndex列的DataFrame ),并将其用于repeat (因为我们想重复同一行3次,所以我们使用Index.repeat + reindex重复3次)。然后使用reset_index + rename_axis + reset_index获取"Var_1“的正确命名和排序。然后,melt将以所需的形状传递数据。最后,我们可以使用sort_values + reset_index获得与您构建的DataFrame相同的DataFrame。

代码语言:javascript
复制
tmp = pd.DataFrame(pairs, index=[0])
out = (tmp.reindex(tmp.index.repeat(3))
       .reset_index(drop=True)
       .rename_axis('Var_1')
       .reset_index()
       .melt(id_vars=['Var_1'], var_name=['Var_2', 'Var_3'], value_name='Var_4')
       .sort_values(by='Var_1')
       .reset_index(drop=True))

输出:

代码语言:javascript
复制
    Var_1 Var_2 Var_3  Var_4
0       0   Ams   Rot     10
1       0   Del   Utr     12
2       0   Ams   Utr     14
3       0   Del   Rot     16
4       1   Ams   Rot     10
5       1   Del   Utr     12
6       1   Ams   Utr     14
7       1   Del   Rot     16
8       2   Ams   Rot     10
9       2   Del   Utr     12
10      2   Ams   Utr     14
11      2   Del   Rot     16

或者,您可以编写一个列表理解并用列表构建一个DataFrame。这与你已经拥有的非常相似。唯一的区别是,它不是构建4个单独的列表,而是构建一个列表。

代码语言:javascript
复制
tmp = [[i, j, k, v] for i in range(3) for (j, k), v in pairs.items()]
df = pd.DataFrame(tmp, columns=['Var_1', 'Var_2', 'Var_3', 'Var_4'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71415857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档