gpt4 book ai didi

python - Pandas DataFrame 根据列改变一个值,索引值比较

转载 作者:太空狗 更新时间:2023-10-30 01:56:26 26 4
gpt4 key购买 nike

假设您有一个 pandas DataFrame,它在正文中有某种数据,在 columnindex 中有 numbers 名字。

>>> data=np.array([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']])
>>> columns = [2, 4, 8]
>>> index = [10, 4, 2]
>>> df = pd.DataFrame(data, columns=columns, index=index)
>>> df
2 4 8
10 a b c
4 d e f
2 g h i

现在假设我们要基于比较索引和列以某种方式操作数据框。请考虑以下事项。

Where index is greater than column replace letter with 'k':

    2  4  8
10 k k k
4 k e f
2 g h i

Where index is equal to column replace letter with 'U':

    2  4  8
10 k k k
4 k U f
2 U h i

Where column is greater than index replace letter with 'Y':

    2  4  8
10 k k k
4 k U Y
2 U Y Y

为了让问题对所有人有用:

  • 进行这种替换的快速方法是什么?

  • 执行此替换的最简单方法是什么?

最小示例的速度结果

  • jezrael:每次循环 556 µs ± 66.1 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

  • user3471881:每个循环 329 µs ± 11.4 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

  • thunderwood:每次循环 4.65 毫秒 ± 252 µs(7 次运行的平均值 ± 标准偏差,每次 100 次循环)


这是重复的吗?我在 google 中搜索了 pandas replace compare index column,最上面的结果是:

Pandas - Compare two dataframes and replace values matching condition

Python pandas: replace values based on location not index value

Pandas DataFrame: replace all values in a column, based on condition

但是,我觉得这些都没有涉及这 a) 可能还是 b) 如何以这种方式进行比较

最佳答案

我想你需要numpy.select带广播:

m1 = df.index.values[:, None] > df.columns.values
m2 = df.index.values[:, None] == df.columns.values


df = pd.DataFrame(np.select([m1, m2], ['k','U'], 'Y'), columns=df.columns, index=df.index)
print (df)
2 4 8
10 k k k
4 k U Y
2 U Y Y

性能:

np.random.seed(1000)

N = 1000
a = np.random.randint(100, size=N)
b = np.random.randint(100, size=N)

df = pd.DataFrame(np.random.choice(list('abcdefgh'), size=(N, N)), columns=a, index=b)
#print (df)

def us(df):
values = np.array(np.array([df.index]).transpose() - np.array([df.columns]), dtype='object')
greater = values > 0
less = values < 0
same = values == 0

values[greater] = 'k'
values[less] = 'Y'
values[same] = 'U'


return pd.DataFrame(values, columns=df.columns, index=df.index)

def jez(df):

m1 = df.index.values[:, None] > df.columns.values
m2 = df.index.values[:, None] == df.columns.values
return pd.DataFrame(np.select([m1, m2], ['k','U'], 'Y'), columns=df.columns, index=df.index)

In [236]: %timeit us(df)
107 ms ± 358 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [237]: %timeit jez(df)
64 ms ± 299 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - Pandas DataFrame 根据列改变一个值,索引值比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com