繁体   English   中英

为 pd.DataFrame 中的单元格分配新值,这是 pd.Series 当系列索引不唯一时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM