[英]How to create a new column in Python Dataframe by referencing two other columns?
[英]How to create a new dataframe row with a new column for every combination of other two columns?
我有一個包含兩列id1
、 id2
的 Pandas 數據框,我需要為來自輸入的id1
、 id2
每個組合創建一個具有 4 行的新列type
值,並且這 4 個值應該是free
、 call
、 pri
、 status
。
輸入:
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.