我有许多变量,我的意图是在多次迭代中填充每个变量,而每个变量都需要一个不同的表达式来提取它们的值。与我所要做的大致相当的是下面的for循环。
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)我想要的输出:
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的以下字典。
发布于 2022-03-09 21:40:02
您可以使用基于索引的解决方案:
由于您有一个dict,使用数据是值和索引创建一个数据have是关键。在您的例子中,您有元组键,所以使用索引将是一个pd.MultiIndex。此时,您有Var_2、Var_3和Var_4。
棘手的部分是从这个数据文件生成Var_1。重复索引3次,并重新索引数据。所有的值都是重复的。所以你有3x (Ams,Rot,10),3x (Del,Utr,12)等等。现在,如果将重复的行组合在一起,则可以使用cumcount创建ID (0 ->第一实例、1 ->第二实例、.)。最后,根据索引(Var_1)对数据进行排序,并将其重置以获得预期的结果。
# 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()输出:
>>> 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发布于 2022-03-09 20:54:44
您可以使用dict-comprehension轻松地设置
names = ['var_1', 'var_2', 'var_3', 'var_4']
values = {n: range(3) for n in names}
df = pd.DataFrame(values) var_1 var_2 var_3 var_4
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2但是用相同的列创建一个数据格式有点奇怪,因为它没有太多的信息
发布于 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。
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))输出:
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个单独的列表,而是构建一个列表。
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'])https://stackoverflow.com/questions/71415857
复制相似问题