簡體   English   中英

如何為其他兩列的每個組合創建一個帶有新列的新數據框行?

[英]How to create a new dataframe row with a new column for every combination of other two columns?

我有一個包含兩列id1id2的 Pandas 數據框,我需要為來自輸入的id1id2每個組合創建一個具有 4 行的新列type值,並且這 4 個值應該是freecallpristatus

輸入:

df = pd.DataFrame({'id1':[1,1,2,2],
                   'id2':[1,2,1,2]})

在此處輸入圖片說明

輸出:

在此處輸入圖片說明

我試圖在這個案例的 pandas 文檔中搜索函數,甚至不知道如何用文字表達。 所以我只是覺得在這里解釋會更好。

如何使用 4 種類型的值創建新列。

@傑斯雷爾:

如何將此type列與現有數據框合並。

我也有其他列,其中包含一些值如下

輸入:

在此處輸入圖片說明

輸出:

在此處輸入圖片說明

我只想將現有輸入行中的值復制到name列的輸出列。 還有更多這樣的專欄。

如果需要的所有元素的所有組合使用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

或者對從列表L創建的 DataFrame 使用cross join

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

您還可以使用重復和分配的組合:

df = (df.loc[df.index.repeat(len(df))]
        .assign(v=len(df)*['free', 'call', 'pri', 'status'])
        .reset_index(drop=True))

你可以試試:

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'])

你可以這樣做

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM