我试图将一个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
值。
答案 0 :(得分:3)
这是由于index
错位。请注意,ds1
的索引值为10
和11
,您要为新列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']