Pandas数据框架:如何将索引后的值设置为0

5
我有一个Pandas数据框,每行包含一个名称和多个数字列。 在每行的特定索引之后(在每行中唯一计算),我想将该行中所有剩余值设置为0。
所以,我尝试了一些东西,并且有以下可行代码:
for i in range(n):
    index = np.where(df.columns == df['match_this_value'][i])[0].item()
    df.iloc[i, index] = df['take_this_value'][i].day 
    df.iloc[i, (index+1):] = 0

然而,由于我的数据集非常大,这需要相当长的时间。对于我的样本数据集,运行时间约为70秒,因为我的整个数据集要长得多。有没有更快的方法来做这件事?此外,在不循环遍历每一行的情况下,有没有更好的方法来进行这种操作?
编辑:抱歉,我应该说明如何计算指数。通过将数据帧的所有列(对于每一行)与一个特定的列进行比较并找到匹配项来计算索引。所以类似这样的东西:
index = np.where(df.columns == df['match_this_value'][i])[0].item()

一旦我有了这个索引,我就将该列的值设置为df中另一列的值。目前整个代码看起来像这样:

for i in range(n):
    index = np.where(df.columns == df['match_this_value'][i])[0].item()
    df.iloc[i, index] = df['take_this_value'][i].day 
    df.iloc[i, (index+1):] = 0

所有数据都是数值型的吗? - jezrael
这很可能是一个 XY 问题 的情况。 - Quang Hoang
1
specific index 是如何计算的? - user10325516
几何上讲,对于一个适当构建的二元矩阵,点积将会给出你的结果。 - Yuca
嗨,我已经编辑了我的代码,更具体地说明了索引的计算方式和我的操作 - 谢谢。 - Mat R
@jezrael 数据框中的值是数字,但列是日期时间值。 - Mat R
2个回答

1
你可以这样做:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4, 4), columns=list('ABCD'))

#           A         B         C         D
# 0  0.750017  0.582230  1.411253 -0.379428
# 1 -0.747129  1.800677 -1.243459 -0.098760
# 2 -0.742997 -0.035036  1.012052 -0.767602
# 3 -0.694679  1.013968 -1.000412  0.752191

indexes = np.random.choice(range(df.shape[1]), df.shape[0])
# array([0, 3, 1, 1])
df_indexes = np.tile(range(df.shape[1]), (df.shape[0], 1))
df[df_indexes>indexes[:, None]] = 0
print(df) 
#           A         B         C        D
# 0  0.750017  0.000000  0.000000  0.00000
# 1 -0.747129  1.800677 -1.243459 -0.09876
# 2 -0.742997 -0.035036  0.000000  0.00000
# 3 -0.694679  1.013968  0.000000  0.00000

在这里,您需要包含一个布尔掩码df_indexes>indexes[:, None],并且此处的indexes将被替换为您的“特定索引”。

我很高兴能够帮助。 - Ayoub ZAROU
还是只需使用 np.arange(df.shape[1]) > indexes[:, None] - jpp

0

考虑以下方法:

import numpy as np
import pandas as pd

# dataframe size
R, C = 10_000_000, 10

# sample data
df = pd.DataFrame(
    np.random.random((R, C)),
    columns=['name', *(f'c_{idx}' for idx in range(C - 1))])

# calculating specific index
cut_column = np.random.randint(1, C, (R,))

# handling data column by column
for idx, col in enumerate(df.columns[1:], 1):
    df[col] = np.where(cut_column > idx, df[col], 0)

在我的机器上,1000万行的运行时间大约为几秒钟。


嗨,这个代码可以工作,但是当cut_column == index时,我想让它等于一个特定的值,我们可以称之为numpy_Array[idx]。我无法弄清楚如何编辑代码使其正常工作? - Mat R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接