我有一个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
答案 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)
我的计算机上一千万行的运行时间约为秒。