2017-08-21 217 views
-1

我有一個簡單的數據集,熊貓條件創造列發出

import pandas as pd 

df = { 
    'columA':['1A','ws rank','rank','ws rank','rank','Drank'], 
'value': [ 1, 12, 34, 50, 3,2] 
} 


df = pd.DataFrame(df) 

1.我想創建一個列「HP」,因爲這是「WS排名」和「排名」和'columnA行喝',如果價值是1,那麼HP是25,如果價值是2,那麼HP是24 ...等等。
所以我首先創建了一個較小的數據集,以僅包含那些行,因爲我的真實數據集非常大。然後,我將連接此數據集和原始數據集以包含「HP」列。但是當我連接數據集時,有重複的行。所以必須有一個更簡單的方法。

我的代碼:

dfrank=df[df["columA"].str.contains('ws rank|rank')] 
dfrank['value'] = dfrank['value'].astype(int) 
dfrank.loc[dfrank.value == 1, 'HP'] = 25 
dfrank.loc[dfrank.value == 2, 'HP'] = 24 
dfrank.loc[dfrank.value == 3, 'HP'] = 23 
dfrank.loc[dfrank.value == 4, 'HP'] = 22 
dfrank.loc[dfrank.value == 5, 'HP'] = 21 
dfrank.loc[dfrank.value == 6, 'HP'] = 20 
dfrank.loc[dfrank.value == 7, 'HP'] = 19 
dfrank.loc[dfrank.value == 8, 'HP'] = 18 
dfrank.loc[dfrank.value == 9, 'HP'] = 17 
dfrank.loc[dfrank.value == 10, 'HP'] = 16 
dfrank.loc[dfrank.value == 11, 'HP'] = 15 
dfrank.loc[dfrank.value == 12, 'HP'] = 14 
dfrank.loc[dfrank.value == 13, 'HP'] = 13 
dfrank.loc[dfrank.value == 14, 'HP'] = 12 
dfrank.loc[dfrank.value == 15, 'HP'] = 11 
dfrank.loc[dfrank.value == 16, 'HP'] = 10 
dfrank.loc[dfrank.value == 17, 'HP'] = 9 
dfrank.loc[dfrank.value == 18, 'HP'] = 8 
dfrank.loc[dfrank.value == 19, 'HP'] = 7 
dfrank.loc[dfrank.value == 20, 'HP'] = 6 
dfrank.loc[(dfrank.value > 20)&(dfrank.value <= 50), 'HP'] = 5 

df2=pd.concat([df, dfrank]) 

是否有更簡單的方式來做到這些條件? 也 我不斷收到此錯誤信息,但我想我已經在使用的形式它的提示 :SettingWithCopyWarning: 值要試圖從一個數據幀的一個切片的副本設置。 嘗試使用的.loc [row_indexer,col_indexer] =值代替

查看的文檔中的注意事項:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy dfrank [ '值'] = dfrank [ '值'] astype(INT) H:。/代碼/ PythonScripts/python_work/dataset1.py:20:SettingWithCopyWarning: 正嘗試在DataFrame的切片副本上設置一個值。 嘗試使用的.loc [row_indexer,col_indexer] =值代替

查看的文檔中的注意事項:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy dfrank.loc [dfrank.value == 1, 'HP'] = 25 C:\用戶\ amywang \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ pandas \ core \ indexing.py:477:SettingWithCopyWarning: 正試圖在來自DataFrame的切片副本上設置一個值。 嘗試使用的.loc [row_indexer,col_indexer] =值代替

查看的文檔中的注意事項:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj [項目] = S

2.然後我想創建一個 'HPpoint'這組「columA的價值觀和總結了「HP」值,但這並沒有工作,返回的列空

df2['HPpoint']=df2.groupby('columA')['HP'].sum() 
+0

可以替換這些2行重複代碼用'dfrank [ 'HP']的= 26 - dfrank.value'或相似。無需爲每個號碼分別設置不同的案例!至於其他問題,你的問題太複雜了,有太多的子問題和問題,而且你沒有樣本輸入數據。 –

+0

@John Zwinck好點!只是好奇,如果沒有這些條件的模式是否有更簡單的方法?但是當我使用你建議的這種方法時,我仍然收到相同的錯誤信息。 – Jessica

+0

簡化您的代碼。簡化你的問題。把它編輯下來,讓你問一個具體的事情。現在太複雜了。每個職位詢問一件事,而不是三件事。 –

回答

1

在Pandas中,當您選擇數據並將其存儲在新變量中時,索引DataFrame會返回reference to the initial DataFrame。因此,您應該爲copy數據框使用.loc作爲新的數據框i。e

dfrank=df[df["columA"].str.contains('ws rank|rank')].copy() 

這將創建新的索引並幫助您爲新的數據框做適當的索引。

既然要映射數據,你可以通過創建一個dictionarya mask然後.loc擺脫很多這樣的線,你可以填寫使用NaN值fillna

dicct = {1:25,2:24,3:23,4:22,5:21,6:20,7:19,8:18,9:17,10:16,11:15,12:14,13:13,14:12,15:11,16:10,17:9,18:8,19:7,20:6} 
df['HP'] = 0 
mask=df["columA"].str.contains('ws rank|rank') 
df.loc[mask,'HP'] = df.loc[mask,'value'].map(dicct).fillna(5) 

輸出:

 
    columA value HP 
0  1A 1.0 0.0 
1 ws rank 14.0 12.0 
2  rank 5.0 21.0 
3 ws rank 5.0 21.0 
4  rank 23.0 5.0 
5 Drank 24.0 5.0 
In [ ]: 

如果您想用groupby sum填充新列,您可以使用transform

df['HPpoint']=df.groupby('columA')['HP'].transform(sum) 

輸出:

 
    columA value HP HPpoint 
0  1A 1.0 0.0  0.0 
1 ws rank 14.0 12.0  33.0 
2  rank 5.0 21.0  26.0 
3 ws rank 5.0 21.0  33.0 
4  rank 23.0 5.0  26.0 
5 Drank 24.0 5.0  5.0 

希望它能幫助

1

有趣....

不知道我完全得到你所有的問題,但這裏是我對上半年....

import pandas as pd 
df = { 
    'columA':['1A','ws rank','rank','ws rank','rank','Drank'], 
'value': [ 1, 12, 34, 50, 3,2] 
} 

df = pd.DataFrame(df) 

df["hp"]=0 

def calc_hp(row): 

    rv=0 
    if row['columA'] in['ws rank','rank','Drank']: 
     rv=25-int(row['value'])   
    return rv 

df['hp'] = df.apply(calc_hp,axis=1) 

df 

它返回

columA value hp 
0 1A 1 0 
1 ws rank 12 13 
2 rank 34 -9 
3 ws rank 50 -25 
4 rank 3 22 
5 Drank 2 23 

我整行傳遞到應用功能,然後使用(希望)您指定的邏輯。