![](/img/trans.png)
[英]Pandas: Using a pd.Series to sort a pd.DataFrame with index
[英]Assign new value to a cell in pd.DataFrame which is a pd.Series when series index isn't unique
如果有人想尝试重现该问题,这是我的数据: https://github.com/LunaPrau/personal/blob/main/O_paired.csv
我有一个 1402 行 × 1402 列的 pd.DataFrame(称为 O),列和索引都为 ['XXX-icsd', 'YYY-icsd', ...] 和单元格值作为一些 np.float64,一些 np .nan 并且有问题的是,有些是 pandas.core.series.Series。
202324-ICSD | 644068-ICSD | 27121-ICSD | 93847-ICSD | 154319-ICSD | |
---|---|---|---|---|---|
202324-ICSD | 0.000000 | 0.029729 | 钠 | 0.098480 | 0.097867 |
644068-ICSD | 钠 | 0.000000 | 钠 | 0.091311 | 0.091049 |
27121-ICSD | 0.144897 | 0.137473 | 0.0 | 0.081610 | 0.080442 |
93847-ICSD | 钠 | 钠 | 钠 | 0.000000 | 0.005083 |
154319-ICSD | 钠 | 钠 | 钠 | 钠 | 0.000000 |
问题是某些单元格(例如O.loc["192693-icsd", "192401-icsd"]
)包含 pandas.core.series.Series 的形式:
192693-icsd 0.129562
192693-icsd 0.129562
Name: 192401-icsd, dtype: float64
我正在努力让这个单元格只包含一个 np.float64。 我试过了:
O.loc["192693-icsd", "192401-icsd"] = O.loc["192693-icsd", "192401-icsd"][0]
和其他各种已知的 forms 为 pd.DataFrame 中的单元格分配一个新值,但他们只为这个单元格中的同一系列分配一个新元素,例如,如果我这样做
O.loc["192693-icsd", "192401-icsd"] = 5
然后当调用O.loc["192693-icsd", "192401-icsd"]
我得到:
192693-icsd 5.0
192693-icsd 5.0
Name: 192401-icsd, dtype: float64
如何修改O.loc["192693-icsd", "192401-icsd"]
使其属于 np.float64 类型?
IIUC,您可以尝试DataFrame.applymap
来检查每个单元格类型,如果是系列,则获取第一行
df = df.applymap(lambda x: x.iloc[0] if type(x) == pd.Series else x)
它按预期工作O.loc["192693-icsd", "192401-icsd"] = O.loc["192693-icsd", "192401-icsd"][0]
检查此 colab 链接: https://colab.research.google.com/drive/1XFXuj4OBu8GXQx6DTqv04XellmFcFWbC?usp=sharing
不是df.loc["192693-icsd", "192401-icsd"]
包含一个系列,你的索引只是不是唯一的。 看看这些输出,这一点尤其明显:
>>> df.loc["192693-icsd"]
202324-icsd 644068-icsd 27121-icsd 93847-icsd 154319-icsd 28918-icsd 28917-icsd ... 108768-icsd 194195-icsd 174188-icsd 159632-icsd 89111-icsd 23308-icsd 253341-icsd
192693-icsd NaN NaN NaN NaN 0.146843 NaN NaN ... NaN 0.271191 NaN NaN NaN NaN 0.253996
192693-icsd NaN NaN NaN NaN 0.146843 NaN NaN ... NaN 0.271191 NaN NaN NaN NaN 0.253996
[2 rows x 1402 columns]
# And the fact that this returns the same:
>>> df.at["192693-icsd", "192401-icsd"]
192693-icsd 0.129562
192693-icsd 0.129562
Name: 192401-icsd, dtype: float64
您可以使用 groupby 解决此问题,但您必须决定如何处理非唯一组。 看起来它们是相同的,所以我们将它们与 max 结合起来:
df = df.groupby(level=0).max()
现在它将按预期工作:
>>> df.loc["192693-icsd", "192401-icsd"])
0.129562120551387
您的非唯一值是:
>>> df.index[df.index.duplicated()]
Index(['193303-icsd', '192693-icsd', '416602-icsd'], dtype='object')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.