2016-12-08 15 views
1

我有2個數據幀我需要劃分包含字符串和浮點數的2個數據幀的值,除法應該避免字符串,只能在float上進行除法。如何在包含字符串和浮點數的Python熊貓中的不同數據框中分割兩行。

DF1

 Col1  Val11 Val12 
    0 A  1  9 
    1 B  3  1 
    2 C  5  4 
    3 D  1  3 
    4 E  7  6 

DF2

 Col2 Val21 Val22 
    0 A  20  19 
    1 B  35  11 
    2 C  46  42 
    3 D  31  53 
    4 E  28  55 

我寫了下面的代碼行

df2.iloc['Percent'] = df1.iloc[4]/df2.iloc[4] 

,但我得到了以下錯誤消息。

TypeError: unsupported operand type(s) for /: 'str' and 'str'

最終DF應該是這樣的

 Col2 Val21 Val22 
    0 A  20  19 
    1 B  35  11 
    2 C  46  42 
    3 D  31  53 
    4 E  28  55 
       0.25  0.10 

感謝,並提前爲支持

回答

1

您需要通過set_index得到所有字符串列索引,然後劃分:

df2 = df2.set_index('Col2') 
df2.loc['Percent'] = df1.set_index('Col1').iloc[4].values/df2.iloc[4] 
print (df2) 

     Val21  Val22 
Col2      
A  20.00 19.000000 
B  35.00 11.000000 
C  46.00 42.000000 
D  31.00 53.000000 
E  28.00 55.000000 
Percent 0.25 0.109091 

如果有多個字符串列使用col的subsets對於分UMNS並添加子集輸出:

df2.loc['Percent'] = df1[['Val11','Val12']].iloc[4].values/df2[['Val21','Val22']].iloc[4] 
print (df2) 
     Col2 Val21  Val22 
0   A 20.00 19.000000 
1   B 35.00 11.000000 
2   C 46.00 42.000000 
3   D 31.00 53.000000 
4   E 28.00 55.000000 
Percent NaN 0.25 0.109091 

更通用的解決方案:

str_cols1 = ['Col1'] 
str_cols2 = ['Col2'] 
df2.loc['Percent'] = df1.drop(str_cols1, axis=1).iloc[4].values/
        df2.drop(str_cols2, axis=1).iloc[4] 
print (df2) 
     Col2 Val21  Val22 
0   A 20.00 19.000000 
1   B 35.00 11.000000 
2   C 46.00 42.000000 
3   D 31.00 53.000000 
4   E 28.00 55.000000 
Percent NaN 0.25 0.109091 

,更好的解決方案與select_dtypes

df2.loc['Percent'] = df1.select_dtypes(['number']).iloc[4].values/
        df2.select_dtypes(['number']).iloc[4] 
print (df2) 
     Col2 Val21  Val22 
0   A 20.00 19.000000 
1   B 35.00 11.000000 
2   C 46.00 42.000000 
3   D 31.00 53.000000 
4   E 28.00 55.000000 
Percent NaN 0.25 0.109091 

編輯的評論:

使用to_numeric用於將非數字值替換爲NaN

df1_numeric = df1.apply(lambda x: pd.to_numeric(x, errors='coerce')) 
df2_numeric = df2.apply(lambda x: pd.to_numeric(x, errors='coerce')) 

df2.loc['Percent'] = df1_numeric.iloc[4].values/df2_numeric.iloc[4] 
print (df2) 
     Col2 Val21  Val22 
0   A 20.00  19 
1   B 35.00   a 
2   C 46.00  42 
3   D 31.00  53 
4   E 28.00  55 
Percent NaN 0.25 0.109091 
+0

因爲這是我只用一個字符串列的例子。如果我有多個字符串列,這個解決方案將工作嗎? –

+0

我添加另一種解決方案,請檢查它。 – jezrael

+0

非常感謝。它運行良好。 –

1

嘗試了這一點:

df2.loc['Percent'] = df1.iloc[4, 1:]/df2.iloc[4, 1:] 
+0

是的,它也工作。謝謝你一個疑問1:在代碼中有什麼意義。 –

+0

它是否將數據放在正確的列中?我不是100%肯定這個答案... 1是在那裏從#1到最後選擇列(即跳過第一個是一個字符串 - 這是什麼導致你的問題) – AlexG

+0

哦..好吧,讓我驗證 –

相關問題