簡體   English   中英

具有條件的列名稱從列值和單元格值派生的數據框

[英]Dataframe with column names derived from column values and cell values by condition

我必須從具有兩列的源pandas數據幀創建結果pandas數據幀。 結果數據幀應具有兩種類型的頭,一種類型應來自源數據幀,該源數據幀是從列值之一派生而來,並在列頭后面附加值。 如果存在重復項,則從源數據幀中直接獲取另一個標頭,並使用唯一的值。 結果數據幀單元格值應為1,具體取決於是否有從列值中派生的對應頭,否則為0。
數據幀如下

dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]})  

dfm   
v   x  
44  1  
39  1
39  1
8   1
40  2
8   2
15  2
15  2

result

x v_8 v_15 v_39 v_40 v_44
1  1   0    1     0    1
2  1   1    0     1    0 

你能用這樣的東西嗎? 我不確定它是最好的解決方案,所以我很想看看其他人發布的內容...

import pandas as pd
dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]}).sort(columns="v")

col_heads = ["v_{}".format(x) for x in dfm.v.unique()]
row_index = dfm.x.unique()

nf = pd.DataFrame(index=row_index, columns=col_heads).fillna(0)
nf.index.name = 'x'

a = dfm.groupby("v")
for i,name in a:
   for val in name.x:
      nf.ix[val, "v_{}".format(i)] = 1

print nf

輸出以下內容:

   v_8  v_15  v_39  v_40  v_44
x
1    1     0     1     0     1
2    1     1     0     1     0

您可以使用功能crosstab ,然后找到值高的1並將其轉換為10astype

dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]})  
print dfm
    v  x
0  44  1
1  39  1
2  39  1
3   8  1
4  40  2
5   8  2
6  15  2
7  15  2

df = pd.crosstab(dfm.x, dfm.v)
#rename columns
df.rename(columns=lambda x: 'v_' + str(x), inplace=True)
#reset column name v to ''
df.columns.name = ''
print df
   v_8  v_15  v_39  v_40  v_44
x                             
1    1     0     2     0     1
2    1     2     0     1     0

print (df > 0)
    v_8   v_15   v_39   v_40   v_44
x                                  
1  True  False   True  False   True
2  True   True  False   True  False

print (df > 0).astype(int)
   v_8  v_15  v_39  v_40  v_44
x                             
1    1     0     1     0     1
2    1     1     0     1     0

暫無
暫無

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

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