潘达斯数据框架基于列、索引值的比较而改变一个值[英] Pandas DataFrame change a value based on column, index values comparison

本文是小编为大家收集整理的关于潘达斯数据框架基于列、索引值的比较而改变一个值的处理方法,想解了潘达斯数据框架基于列、索引值的比较而改变一个值的问题怎么解决?潘达斯数据框架基于列、索引值的比较而改变一个值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

假设您有一个pandas DataFrame,该>在体内有某种数据,column和index名称中的数字 .

>>> 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

现在假设我们要根据比较索引和列以某种方式操纵数据框架.考虑以下内容.

索引大于列替换字母'k':

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

索引等于列替换字母'u':

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

列大于索引,用'y'替换字母:

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

使问题对所有人有用:

  • 替换的快速方法是什么?

  • 最简单的替代方法是什么?

速度由最小示例

产生
  • jezrael :556 µs ± 66.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

  • user3471881 :329 µs ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

  • Thunderwood :4.65 ms ± 252 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


这是重复的吗? 我搜索了Google的pandas replace compare index column,最佳结果是:

pandas "> pandas-比较两个dataframes并替换值匹配条件

python pandas:python pandas:python pandas:基于位置的替换值索引值

在基于条件

的列

但是,我没有任何触及这些触及的触摸

推荐答案

我认为您需要 numpy.select numpy.select numpy.select 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)

其他推荐答案

不确定要实现这一目标的最快方法,但一种非常简单的方法就是像这样的数据框架这样做:

for i in df.index:
    for j in df.columns:
        if i>j:
            df.loc[i,j]='k'
        elif j>i:
            df.loc[i,j]='y'
        else:
            df.loc[i,j]='u'

其他推荐答案

1.使用np.arrays + np.select:

values = np.array(np.array([df.index]).transpose() - np.array([df.columns]))

greater = values > 0
same = values == 0

df = pd.DataFrame(np.select([greater, same], ['k', 'U'], 'Y'), columns=df.columns, index=df.index)

2.使用np.arrays和手动掩蔽.

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'


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

本文地址:https://www.itbaoku.cn/post/1728115.html