如何为其他两列的每种组合使用新列创建一个新的数据框行?

时间:2019-08-14 13:05:28

标签: python pandas csv dataframe multiple-columns

我有一个 Pandas数据框,其中包含两列id1id2,我需要创建 新列-输入中的typeid1的每个组合的id2值有4行,这4个值应该是freecall,{{ 1}},pri

输入:

status

enter image description here

输出:

enter image description here

在这种情况下,我尝试在pandas文档中搜索功能,甚至不确定如何用语言表达。因此,我认为最好在这里进行解释。

请有人帮我如何用4种类型的值创建新列。

@jezrael:

如何将此df = pd.DataFrame({'id1':[1,1,2,2], 'id2':[1,2,1,2]}) 列与现有数据框合并。

我还有其他列,其中包含以下一些值

输入:

enter image description here

输出:

enter image description here

我只想将现有输入行中的值复制到type列的输出列中。并且还有更多这样的专栏。

4 个答案:

答案 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