我有一个 Pandas数据框,其中包含两列id1
,id2
,我需要创建
新列-输入中的type
,id1
的每个组合的id2
值有4行,这4个值应该是free
,call
,{{ 1}},pri
输入:
status
输出:
在这种情况下,我尝试在pandas文档中搜索功能,甚至不确定如何用语言表达。因此,我认为最好在这里进行解释。
请有人帮我如何用4种类型的值创建新列。
@jezrael:
如何将此df = pd.DataFrame({'id1':[1,1,2,2],
'id2':[1,2,1,2]})
列与现有数据框合并。
我还有其他列,其中包含以下一些值
输入:
输出:
我只想将现有输入行中的值复制到type
列的输出列中。并且还有更多这样的专栏。
答案 0 :(得分:2)
如果需要所有元素的所有组合,请使用product
和列和列表,并通过构造函数创建DataFrame
:
from itertools import product
df = pd.DataFrame({'id1':[1,1,2,2],
'id2':[1,2,1,2],
'name':['name11','name12','name21','name22']})
L = ['free', 'call', 'pri', 'status']
cols = ['id1','id2', 'name']
L1 = df[cols].values.tolist()
df2 = pd.DataFrame([x + [y] for x, y in (product(L1, L))], columns=cols + ['type'])
print (df2)
id1 id2 name type
0 1 1 name11 free
1 1 1 name11 call
2 1 1 name11 pri
3 1 1 name11 status
4 1 2 name12 free
5 1 2 name12 call
6 1 2 name12 pri
7 1 2 name12 status
8 2 1 name21 free
9 2 1 name21 call
10 2 1 name21 pri
11 2 1 name21 status
12 2 2 name22 free
13 2 2 name22 call
14 2 2 name22 pri
15 2 2 name22 status
或对从列表cross join
创建的DataFrame使用L
:
cols = ['id1','id2', 'name']
L = ['free', 'call', 'pri', 'status']
df1 = pd.DataFrame({'type':L, 'a':1})
df2 = df[cols].assign(a=1).merge(df1, on='a').drop('a', axis=1)
print (df2)
id1 id2 name type
0 1 1 name11 free
1 1 1 name11 call
2 1 1 name11 pri
3 1 1 name11 status
4 1 2 name12 free
5 1 2 name12 call
6 1 2 name12 pri
7 1 2 name12 status
8 2 1 name21 free
9 2 1 name21 call
10 2 1 name21 pri
11 2 1 name21 status
12 2 2 name22 free
13 2 2 name22 call
14 2 2 name22 pri
15 2 2 name22 status
答案 1 :(得分:0)
您还可以使用重复和分配的组合:
df = (df.loc[df.index.repeat(len(df))]
.assign(v=len(df)*['free', 'call', 'pri', 'status'])
.reset_index(drop=True))
答案 2 :(得分:0)
您可以尝试:
data = list()
for index, row in df.iterrows():
for value in ['free', 'call', 'pri', 'status']:
data.append((row.id1, row.id2, value))
pd.DataFrame(data, columns=['id1', 'id2', 'type'])
答案 3 :(得分:0)
您可以这样做
id1 = np.array([1,1,2,2]).repeat(4)
id2 = np.array([1,2,1,2]).repeat(4)
df = pd.DataFrame({'id1':id1,
'id2':id2})
df["type"] = ["free", "call", "pri", "status"]*4
print(df)
输出为
id1 id2 type
0 1 1 free
1 1 1 call
2 1 1 pri
3 1 1 status
4 1 2 free
5 1 2 call
6 1 2 pri
7 1 2 status
8 2 1 free
9 2 1 call
10 2 1 pri
11 2 1 status
12 2 2 free
13 2 2 call
14 2 2 pri
15 2 2 status