我有一个2个初始列col1和col2的数据框。我想根据名为y的列表中的值添加更多列。要点是len(y)是变化的。
import numpy as np
import pandas as pd
class Banana:
def __init__(self):
self.val1 = None
self.Val2 = None
self.name = None
b_a = Banana()
b_b = Banana()
b_c = Banana()
bananas = list()
# step 1: data preparation
case_dependent_value = 3
v1 = 1
v2 = np.arange(case_dependent_value)
b_a.val1 = v1
b_a.val2 = v2
b_a.name = 'b_a'
b_b.val1 = v1
b_b.val2 = v2
b_b.name = 'b_b'
b_c.val1 = v1
b_c.val2 = v2
b_c.name = 'b_c'
bananas.append(b_a)
bananas.append(b_b)
bananas.append(b_c)
# step 2: make dataframe
values_1 = list()
names = list()
for each_banana in bananas:
values_1.append(each_banana.val1)
names.append(each_banana.names)
df = pd.DataFrame({'values_1': values_1, 'names': names})
生成的df是:
names | values_1
0 b_a | 1
1 b_b | 1
2 b_c | 1
现在我想将对象的val2 b_a,b_b,b_c添加为df中的列。关键是val2的大小随着不同的情况而变化。但每种情况下,大小都是已知的,就像它的例子那样3.所以结果应该是
names | values_1 | values_2_1 | values_2_2 | values_2_3
0 b_a | 1 | 0 | 1 | 2
1 b_b | 1 | 0 | 1 | 2
2 b_c | 1 | 0 | 1 | 2
你能告诉我如何实现它吗?感谢
答案 0 :(得分:2)
如果预先知道要创建的列数的大小,那么您可以使用DF.assign()
在dictionary unpacking的帮助下动态地将列分解到其函数调用中,如下所示:
# consider a given size
size = 3
# generate column names with incremental ranges
cols = ["value_2_{}".format(item) for item in range(1,size+1)]
# map the column names and it's corresponding value to a dict object
df.assign(**dict(zip(cols, range(size))))