首页 > 解决方案 > 如何为熊猫中的一个特定行切换列元素?

问题描述

所以,我正在处理来自我的研究实验室的数据,并试图对其进行排序和移动等。大多数东西对我的问题并不重要,我不想详细说明,因为保密的东西,但我有一个带有列和行的大表,我想专门在一行中切换两列的元素。

我对代码进行的极其糟糕的尝试是这样的(我将变量重写为更加模糊,但它们是有意义的):

for x in df.columna.values:

*some if statements*

df.loc[df.index([df.loc[df['columna'] == x]]), ['columnb', 'columna']] = df[df.index([df.loc[df['columna'] == x]]), ['columna', 'columnb']].numpy()


我知道我拥有的代码是垃圾(还有方法 - 带有 for 循环和 if 语句。我知道我可以将它抽象为 TON 但我只是想真正找出一种让它工作的方法,我会清理它,让它更漂亮,更高效。我在星期二了解到熊猫存在,所以我不是专家),但我认为我的问题在于我得到的方式。

我最近遇到的一个错误是我用来获取行的方法是给我 1 行 x 22 列,我认为我需要行的名称/索引。这就是为什么现在有索引功能的原因。但是,我现在收到错误:

TypeError: 'RangeIndex' object is not callable

我很困惑。抱歉,我写了很多文字,基本上:有没有更简单的方法可以为一个特定的行切换两列的元素(就 x 而言,该行中的一个元素)?

我认为我最大的问题是试图以它想要的格式获取行“名称”。尽管我可能还有很多其他问题,因为老实说,我真的迷路了。

标签: pythonpython-3.xpandasdataframe

解决方案


你太接近了!你得到的错误源于试图 slice df.index([df.loc[df['columna'] == x]])。这里不需要括号,应该读为:df.index[df.loc[df['columna'] == x]].

但是,这里有一个示例,说明如何在提供要交换的值(或多个值)时在列之间交换值。

样本数据

df = pd.DataFrame({
    "A": list("abcdefg"),
    "B": [1,2,3,4,5,6,7]
})

print(df)
   A  B
0  a  1
1  b  2
2  c  3
3  d  4
4  e  5
5  f  6
6  g  7

假设我们要交换 A 为“c”或“f”的值。为此,我们需要首先创建一个只选择这些行的掩码。为此,我们可以使用.isin. 然后为了执行我们的交换,我们实际上采用了与您完全相同的方法!包括.to_numpy()非常重要,因为没有它,Pandas 实际上会为您重新对齐列并导致值不被交换。把它们放在一起:

swap_at = ["c", "f"]
swap_at_mask = df["A"].isin(swap_at) # mask where columns "A" is either equal to "c" or "f"

# Without the `.to_numpy()` at the end, pandas will realign the Dataframe
#  and no values will be swapped
df.loc[swap_at_mask, ["A", "B"]] = df.loc[swap_at_mask, ["B", "A"]].to_numpy()

print(df)
   A  B
0  a  1
1  b  2
2  3  c
3  d  4
4  e  5
5  6  f
6  g  7

推荐阅读