2016-12-01 81 views
-4

后,我看了一个Excel文件:如何创建一个使用apply()后创建的pandas数据框的新列?

进口大熊猫作为PD

在:

df = pd.read_excel('file.xlsx') 
df = df.drop('Unnamed: 0', 1) 
df 

日期:

A B C D E 
0 2345 typeA NO http://www.example.com/... 
2 23423 483  NO http://www.example.com/... 
3 234234 typeC NO http://www.example.com/... 
4 2343 typeA NO http://www.example.com/... 
5 23423 typeA NO http://www.example.com/... 
6 234  typeA NO http://www.example.com/... 

我正在申请多项功能于几个大熊猫数据帧列那在添加更多列后创建:apply()

在:

df['E'] = df['D'].apply(checker) 
df 

日期:

A B C D E 
0 2345 typeA NO http://www.example.com/... OK 
1 234  483  NO http://www.example.com/... FALSE 
2 23423 483  NO http://www.example.com/... OK 
3 234234 typeC NO http://www.example.com/... OK 
4 2343 typeA NO http://www.example.com/... OK 
5 23423 typeA NO http://www.example.com/... FALSE 
6 234  typeA NO http://www.example.com/... OK 

然后我做:df = df[df.E == 'OK']df = df.loc[df.E =='OK']

然后,我申请到上述数据框中一个新的功能:

在:

df['F'] = df['D'].apply(new_function_foo) 

虽然它的实际工作,因为我想我得到了这样的警告:

日期:

/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:10: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

我查了一下资料,我试图跟进说明:

df['F'] = df.loc[['E']].apply(function_foo) 

并且

df['ColF'] = df.loc[:,'ColE'].apply(function_foo) 

但是,我不明白如何解决上述警告。因此,我该如何正确应用功能?

+1

这不是在警告来自例如,如果你做到这一点。你可能在之前的代码中创建了df的副本。在这条线之前寻找类似于df2 = df的东西或类似的东西 –

+0

@StevenG,我忘了提及:我做了'df = df [df.E =='OK']' – tumbleweed

+0

而不是这样做:'df = df.loc [df.E =='OK']' –

回答

1

如果您可以复制数据帧,则可以使用任何您喜欢的方法。当你做这样的事情

df = df[df.E == 'OK'].copy() 

不会有错误:

df['F'] = df['D'].apply(new_function_foo) 
+0

这个帮了我。使用'.copy()'有什么缺点? – tumbleweed

+0

缺点是您使用更多的内存,因为过滤的数据正被复制到新的内存位置 – AlexG

2

然后我做:DF = DF [df.E == 'OK']和df = df.loc [df.E == 'OK']

这不是在做什么你认为是。将df重新分配到片段或df的视图不会使其不是片段或df的视图,它只是使它不能再引用原始df。不要这样做。

然后,当你尝试设置某个切片时,pandas会提醒你,将切片设置到另一个切片会导致意想不到的结果(我认为这是因为熊猫用来做这件事的方法是基于你的python实现,但我不是开发者)。

在任何情况下,我想你想要做的是(在将来请始终显示预期输出):

df.loc[df['E']=='OK','F'] = df[df['E']=='OK']['D'].apply(function_foo) 

df.loc[df['E']=='OK','F'] = df.loc[df['E']=='OK','D'].apply(function_foo) 

的重要组成部分,以清除错误在等号之前.loc。这是告诉大熊猫究竟在哪里把这些值放在完整的数据框里,所以没有什么可以混淆的。您可能需要先使用'F'列,使用df.insert(5,'F',None),以便有些事情可以指向。

1

我仍然认为你做了别的事情,你没有在你的代码中显示我们。试试这个:

df = pd.DataFrame({'A': range(1, 10), 'B': range(1, 10), 'C': range(1, 10), 'D': range(1, 10), 'E': [1,1,1,2,2,2,2,3,4]}) 
df = df.loc[df.E == 1] 
df['F'] = df.apply(sum, axis=1) 
In[71]: df 
Out[71]: 
    A B C D E F 
0 1 1 1 1 1 5 
1 2 2 2 2 1 9 
2 3 3 3 3 1 13 

这个代码没有产生警告。

即使这样做:

df = pd.DataFrame({'A': range(1, 10), 'B': range(1, 10), 'C': range(1, 10), 'D': range(1, 10), 'E': [1,1,1,2,2,2,2,3,4]}) 
df = df[df.E == 1] 
df['F'] = df['D'].apply(lambda x: x/2) 
df 
Out[77]: 
    A B C D E F 
0 1 1 1 1 1 0 
1 2 2 2 2 1 1 
2 3 3 3 3 1 1 

仍然没有警告生成。你能创建一个简短的,可复制的例子吗?

相关问题