从一个Pandas Dataframe复制单行到另一个导致丢失值的结果

时间:2017-07-25 19:20:20

标签: python python-3.x pandas numpy

我试图将一个Pandas数据帧中的单个值追加到另一个。这两个数据帧具有相同的行数,因此我没想到这会导致任何问题。但是,虽然它没有抛出错误,但输出有问题。

它导致后续列的最后两行为nan值,并且该过程中省略了该行中的一个值。

这是第一个数据帧`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']

运行上述行后检查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']

它产生相同的警告和相同的数据帧结果,最后有一个缺失值和两个nan值。

1 个答案:

答案 0 :(得分:3)

这是由于index错位。请注意,ds1的索引值为1011,您要为新列ds1分配一个没有这些索引的系列。这导致这两个指数缺失值。

values从右侧分配到左侧的列,以避开对齐问题。

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

如果索引对您毫无意义,您可以提前reset_index

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

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