熊猫数据框:如何将索引设置为0

时间:2019-06-21 12:29:47

标签: python pandas dataframe

我有一个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秒,因为我的整个数据集都更长。有更快的方法吗?此外,有没有更好的方法可以执行此操作而不循环遍历每一行?


编辑: 抱歉,我应该指定如何计算索引。索引是通过np计算的,其中将数据帧的所有列(每一行)与一个特定列进行比较,然后找到匹配项。像这样:

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

2 个答案:

答案 0 :(得分: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将被替换为“特定索引”

答案 1 :(得分: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)

我的计算机上一千万行的运行时间约为秒。