Tôi có một DataFrame đa giác MultiIndex, trong đó tôi muốn áp dụng một hàm cho một trong các cột của nó và gán kết quả cho cùng một cột đó.Áp dụng một hàm vào cột Đa giác.DataFrame
In [1]:
import numpy as np
import pandas as pd
cols = ['One', 'Two', 'Three', 'Four', 'Five']
df = pd.DataFrame(np.array(list('ABCDEFGHIJKLMNO'), dtype='object').reshape(3,5), index = list('ABC'), columns=cols)
df.to_hdf('/tmp/test.h5', 'df')
df = pd.read_hdf('/tmp/test.h5', 'df')
df
Out[1]:
One Two Three Four Five
A A B C D E
B F G H I J
C K L M N O
3 rows × 5 columns
In [2]:
df.columns = pd.MultiIndex.from_arrays([list('UUULL'), ['One', 'Two', 'Three', 'Four', 'Five']])
df['L']['Five'] = df['L']['Five'].apply(lambda x: x.lower())
df
-c:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
Out[2]:
U L
One Two Three Four Five
A A B C D E
B F G H I J
C K L M N O
3 rows × 5 columns
In [3]:
df.columns = ['One', 'Two', 'Three', 'Four', 'Five']
df
Out[3]:
One Two Three Four Five
A A B C D E
B F G H I J
C K L M N O
3 rows × 5 columns
In [4]:
df['Five'] = df['Five'].apply(lambda x: x.upper())
df
Out[4]:
One Two Three Four Five
A A B C D E
B F G H I J
C K L M N O
3 rows × 5 columns
Như bạn có thể thấy, các chức năng không áp dụng cho các cột, tôi đoán vì tôi nhận được cảnh báo này:
-c:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
gì là lạ là lỗi này chỉ xảy ra đôi khi, và tôi thiên đường đã không thể hiểu được khi nào nó xảy ra và khi nào thì không.
tôi quản lý để áp dụng các chức năng cắt các dataframe với .loc
như cảnh báo đề nghị:
In [5]:
df.columns = pd.MultiIndex.from_arrays([list('UUULL'), ['One', 'Two', 'Three', 'Four', 'Five']])
df.loc[:,('L','Five')] = df.loc[:,('L','Five')].apply(lambda x: x.lower())
df
Out[5]:
U L
One Two Three Four Five
A A B C D e
B F G H I j
C K L M N o
3 rows × 5 columns
nhưng tôi muốn hiểu lý do tại sao hành vi này xảy ra khi thực hiện cắt dict-tương tự (ví dụ df['L']['Five']
) và không phải khi sử dụng cắt .loc
.
LƯU Ý: Các DataFrame xuất phát từ một tập tin HDF được không multiindexed là thế này có lẽ là nguyên nhân của hành vi kỳ lạ?
EDIT: Tôi đang sử dụng Pandas v.0.13.1
và NumPy v.1.8.0
Tôi thực sự thực sự thích giải thích này ... Tôi biết chúng tôi có một tài liệu tương tự trong tài liệu, nhưng điều này có văn xuôi tốt hơn. Chúng ta có thể làm một 'pd.merge (orig_doc, this_explanation, how = 'right')'? :) –
được cập nhật: http://pandas-docs.github.io/pandas-docs-travis/indexing.html#returning-a-view-versus-a-copy – Jeff