ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 通过切片索引和条件行来设置值

2019-06-23 05:43:39  阅读:271  来源: 互联网

标签:python dataframe pandas multi-index


尝试通过切断多索引并设置列’Z’条件值来设置col’X’值.我可以很容易地设置col’X’值,但是我在试图找出条件时遇到困难.

import pandas as pd

FOOBAR = (['foo','foo','foo','foo','bar','bar','bar','bar'])
NUM1 = ([5,5,6,6,8,8,5,5])
NUM2 = ([1,1,2,2,3,3,1,1])
NUM3 = ([1001,1002,1002,1002,1003,1004,1004,1005])

#build and name index using data
index = pd.MultiIndex.from_arrays([FOOBAR,NUM1,NUM2,NUM3], 
                                  names=['iFOOBAR','iNUM1','iNUM2','iNUM3'])

df = pd.DataFrame({'X': [ 0, 1, 2, 3, 4, 5, 6, 7],
                   'Y': [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
                   'Z': [ 1, 2, 2, 4, 5, 6, 7, 7],
                   'FL': [0.1,0.1,0.2,0.2,0.4,0.4,0.1,0.1]
                   }, index=index)

df.sortlevel(inplace=True)
idx = pd.IndexSlice

#original df
#                            FL  X  Y  Z
#iFOOBAR iNUM1 iNUM2 iNUM3              
#bar     5     1     1004   0.1  6  G  7
#                    1005   0.1  7  H  7
#        8     3     1003   0.4  4  E  5
#                    1004   0.4  5  F  6
#foo     5     1     1001   0.1  0  A  1
#                    1002   0.1  1  B  2
#        6     2     1002   0.2  2  C  2
#                    1002   0.2  3  D  4

#set value in 'X' based on index
newdf = df.loc[idx['foo',5,1,:], idx['X']] = 999

#new df
#                            FL    X  Y  Z
#iFOOBAR iNUM1 iNUM2 iNUM3                
#bar     5     1     1004   0.1    6  G  7
#                    1005   0.1    7  H  7
#        8     3     1003   0.4    4  E  5
#                    1004   0.4    5  F  6
#foo     5     1     1001   0.1  999  A  1
#                    1002   0.1  999  B  2
#        6     2     1002   0.2    2  C  2
#                    1002   0.2    3  D  4

#set value in 'X' base on index and 'Z' == 2 ???
#nextdf = df.loc[idx['foo',5,1,:], idx['Z'== 2]], 'X' = 999

#next df: desired output
#                            FL    X  Y  Z
#iFOOBAR iNUM1 iNUM2 iNUM3                
#bar     5     1     1004   0.1    6  G  7
#                    1005   0.1    7  H  7
#        8     3     1003   0.4    4  E  5
#                    1004   0.4    5  F  6
#foo     5     1     1001   0.1    0  A  1
#                    1002   0.1  999  B  2
#        6     2     1002   0.2    2  C  2
#                    1002   0.2    3  D  4

解决方法:

试试这个:(一行)

df.loc[idx[:,5,1,(df['Z'] == 2)],idx['X']] = 999
df


                           FL    X  Y  Z
iFOOBAR iNUM1 iNUM2 iNUM3                
bar     5     1     1004   0.1    6  G  7
                    1005   0.1    7  H  7
        8     3     1003   0.4    4  E  5
                    1004   0.4    5  F  6
foo     5     1     1001   0.1    0  A  1
                    1002   0.1  999  B  2
        6     2     1002   0.2    2  C  2
                    1002   0.2    3  D  4
In [126]:

标签:python,dataframe,pandas,multi-index
来源: https://codeday.me/bug/20190623/1268004.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有