如何根据条件

时间:2015-11-26 13:27:45

标签: python pandas

这篇文章包含两个问题,涉及我在尝试根据给定条件替换熊猫数据框中的元素时遇到的问题。我是熊猫新手,所以任何建议都会有所帮助。

1:修改一定长度的字符串

考虑Panda数据框对象中的A列,df:

SSIC
103
1040
1054
1065
107

我想将整数0附加到长度小于4的每个单元格。也就是说,我想获得:

SSIC
0103
1040
1054
1065
0107

值的类型为float64。

目前,我使用过这种方法:

SSIC1 = df['SSIC'].astype('int64').astype(str)

for i,n in enumerate(SSIC1):
    if len(SSIC1[i]) == 4:
       SSIC1[i] = '0' + SSIC1[i]

df['SSIC'] = SSIC1

它有效,但我想知道它是否相当冗长。有没有更直接的方法来解决这个问题?

2:使用where子句

时设置复制警告

我在数据框中有以下两列

A  B
2  1
3  4
4  6
5  4
5  2

我想要替换A列中取值为5的单元格,并将值放在B中的同一行。

我使用了where条件:

df['A']=df['A'].where(df['A'] == 5, df['B'], inplace=True)

但它给了我以下错误:

  

SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   如果名称 ==' 主要':

第一次运行时没有出现此警告。有什么想法为什么会出现?

2 个答案:

答案 0 :(得分:2)

对于您的第一部分,请调用矢量化str.zfill

In [167]:
df['SSIC'].astype(str).str.zfill(4)

Out[167]:
0    0103
1    1040
2    1054
3    1065
4    0107
Name: SSIC, dtype: object

如果astype已经dtype

,您可能不需要致电str

答案 1 :(得分:1)

使用dataframe.at []函数。那是:

df.at [row_index,column_name] ='所需的作业'

例如:

df = pd.DataFrame(data=[['iqbal',2,88]],columns=['name','roll','marks'],index=[0])
df.at[0,'name']= 'Joy'

`