2017-07-25 18 views
1

あるPandasデータフレームの1行の値を別のPandasデータフレームに追加しようとしています。 2つのデータフレームの行数が同じであるため、問題が発生するとは思われませんでした。ただし、エラーは発生しませんが、出力には問題があります。1つのPandasデータフレームから別のPandasデータフレームへの1つの行のコピーが欠損値になる

追加された列の最後の2つの行がnanの値になり、その行の値の1つがプロセスで省略されます。ここで

は、最初のデータフレーム `DS1である ':

+----+-----------+-------+-----------+------------+--------------------+ 
| | Unique ID | Zip | Revenue | Population | Revenue_Per_Person | 
+----+-----------+-------+-----------+------------+--------------------+ 
| 1 |  179 | 75208 | 67789037 |  30171 |  2246.827649067 | 
| 2 |  186 | 75208 | 62488032 |  30171 | 2071.1289649001 | 
| 3 |  180 | 75212 | 107230739 |  24884 | 4309.2243610352 | 
| 4 |  182 | 75212 | 81768596 |  24884 | 3285.9908374859 | 
| 5 |  181 | 75137 | 93296769 |  18861 | 4946.5441386989 | 
| 6 |  183 | 75237 | 79177044 |  17101 | 4629.9657329981 | 
| 7 |  187 | 75237 | 60000000 |  17101 | 3508.5667504824 | 
| 9 |  185 | 75236 | 76489996 |  15949 | 4795.9117186031 | 
| 10 |  189 | 75236 | 55203335 |  15949 | 3461.2411436454 | 
| 11 |  188 | 75115 | 57451134 |  48877 |  1175.422673241 | 
+----+-----------+-------+-----------+------------+--------------------+ 

そして第二に、` DS2':ここで

+---+-----------+-------+---------+ 
| |  0  | 1 | cluster | 
+---+-----------+-------+---------+ 
| 0 | 67789037 | 30171 |  1 | 
| 1 | 62488032 | 30171 |  1 | 
| 2 | 107230739 | 24884 |  0 | 
| 3 | 81768596 | 24884 |  0 | 
| 4 | 93296769 | 18861 |  0 | 
| 5 | 79177044 | 17101 |  0 | 
| 6 | 60000000 | 17101 |  1 | 
| 7 | 76489996 | 15949 |  0 | 
| 8 | 55203335 | 15949 |  1 | 
| 9 | 57451134 | 48877 |  2 | 
+---+-----------+-------+---------+ 

は私の元のコードです:

ds1['Type'] = ds2['cluster'] 

I上記の行を実行した後にds1の値をチェックすると、ds1データフレームに以下の値が得られます。

+----+-----------+-------+--------------------+------------+--------------------+------+ 
| | Unique ID | Zip | Revenue   | Population | Revenue_Per_Person | Type | 
+----+-----------+-------+--------------------+------------+--------------------+------+ 
| 1 | 179  | 75208 | 67789037.0   | 30171  | 2246.827649066985 | 1.0 | 
| 2 | 186  | 75208 | 62488032.0   | 30171  | 2071.1289649000696 | 0.0 | 
| 3 | 180  | 75212 | 107230738.99999999 | 24884  | 4309.2243610352025 | 0.0 | 
| 4 | 182  | 75212 | 81768596.0   | 24884  | 3285.9908374859347 | 0.0 | 
| 5 | 181  | 75137 | 93296769.0   | 18861  | 4946.544138698902 | 0.0 | 
| 6 | 183  | 75237 | 79177044.0   | 17101  | 4629.96573299807 | 1.0 | 
| 7 | 187  | 75237 | 60000000.0   | 17101  | 3508.566750482428 | 0.0 | 
| 9 | 185  | 75236 | 76489995.99999999 | 15949  | 4795.911718603046 | 2.0 | 
| 10 | 189  | 75236 | 55203334.99999999 | 15949  | 3461.241143645369 | nan | 
| 11 | 188  | 75115 | 57451133.99999999 | 48877  | 1175.4226732409925 | nan | 
+----+-----------+-------+--------------------+------------+--------------------+------+ 

それは、このコードは次の警告を投げないことに、注意することは興味深いです:

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

だから私は別のアプローチを試してみました:同じ警告と同じを生成

ds1['Type'] = ds2.loc[:,'cluster'] 

1つの欠損値と最後に2つのnan値を持つデータフレーム結果。

+1

パンダは、固有のデータ・アラインメントを行いreset_indexできました。同じ長さのデータフレームごとに異なるインデックスがあります。 1つは0であり、もう1つは1から始まります。 –

答えて

3

これはindexミスアラインメントによるものです。 ds1には1011のインデックス値があり、これらのインデックスのない系列を新しい列ds1に割り当てることに注意してください。その結果、これら2つの指標の値が失われます。

右側のvaluesを左側の列に割り当て、配置の問題を回避します。インデックスはあなたに無意味である場合

ds1['Type'] = ds2['cluster'].values 

、あなたは前もって

ds1.reset_index(drop=True, inplace=True) 
ds2.reset_index(drop=True, inplace=True) 

ds1['Type'] = ds2['cluster'] 
関連する問題