在Python熊貓中向現有DataFrame添加新列



Answers

這是添加新列的簡單方法: df['e'] = e

Question

我有以下索引DataFrame與命名的列和行不連續的數字:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

我想向現有的數據框添加一個新的列'e' ,並且不希望在數據框中更改任何內容(即新列的長度始終與DataFrame的長度相同)。

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

我嘗試了不同版本的joinappendmerge ,但是我沒有得到我想要的結果,最多只有錯誤。 我如何在上面的例子中添加列e




如果您想將整個新列設置為初始基值(例如None ),您可以這樣做: df1['e'] = None

這實際上會將“對象”類型分配給單元格。 因此,稍後您可以將復雜數據類型(如列表)自由放置到單個單元格中。




萬全:

df.loc[:, 'NewCol'] = 'New_Val'

例:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0



如果你得到了SettingWithCopyWarning ,一個簡單的解決方法就是複制你試圖添加列的DataFrame。

df = df.copy()
df['col_name'] = values



  1. 首先創建一個包含相關數據的python list_of_e。
  2. 使用這個:df ['e'] = list_of_e



直接通過NumPy做到這一點將是最有效的:

df1['e'] = np.random.randn(sLength)

請注意,我的原始(非常古老的)建議是使用map (速度慢得多):

df1['e'] = df1['a'].map(lambda x: np.random.random())



我得到了可怕的SettingWithCopyWarning ,並且它沒有通過使用iloc語法修復。 我的DataFrame是由來自ODBC源的read_sql創建的。 使用上面的低技術建議,以下工作適合我:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

這工作得很好,最後插入列。 我不知道這是否是最有效的,但我不喜歡警告消息。 我認為有一個更好的解決方案,但我找不到它,我認為這取決於索引的某些方面。
注意 。 這只能工作一次,並會提供一個錯誤消息,如果試圖覆蓋和現有的列。
注意如上所述,從0.16.0分配是最好的解決方案。 請參閱文檔http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign適用於不覆蓋中間值的數據流類型。




將新列'e'添加到現有數據框中

 df1.loc[:,'e'] = Series(np.random.randn(sLength))



我一直在尋找一種將numpy.nan列添加到數據SettingWithCopyWarning而不會收到愚蠢的SettingWithCopyWarning的一般方法。

來自以下方面:

  • 這裡的答案
  • 這個關於傳遞變量作為關鍵字參數的問題
  • 這種方法用於在線生成一個numpy的NaN數組

我想出了這個:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})



但有一點需要注意的是,如果你這樣做

df1['e'] = Series(np.random.randn(sLength), index=df1.index)

這將實際上是df1.index上的連接。 所以如果你想要有一個連接效果,我可能不完美的解決方案是創建一個索引值覆蓋數據的宇宙的數據框,然後使用上面的代碼。 例如,

data = pd.DataFrame(index=all_possible_values)
df1['e'] = Series(np.random.randn(sLength), index=df1.index)



Related