Как сделать так, чтобы возвращенный кадр данных pandas был представлением, чтобы я мог выполнять преобразование? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть файл данных pandas с именем merge, который выглядит следующим образом:

filepath                        timestamp  label_x  label_y X   Y   W   H
S6/N11/N11_R1/S6_N11_R1_IMAG0274    -----   empty   NaN NaN NaN NaN NaN
S6/N11/N11_R1/S6_N11_R1_IMAG0275    -----   empty   NaN NaN NaN NaN NaN
S6/N11/N11_R1/S6_N11_R1_IMAG0276    -----   empty   NaN NaN NaN NaN NaN
S6/N11/N11_R1/S6_N11_R1_IMAG0277    -----   empty   NaN NaN NaN NaN NaN

Некоторые временные метки отсутствуют, я хотел бы получить метки времени из метаданных изображения (местоположение указано в столбце filepath). Как видите, filepath содержит папки, начинающиеся с имени S6. Эти папки должны быть от S1 до S6, но в настоящее время я только папки S1 и S2. Я хотел бы нарезать эти папки и выполнять преобразования:

import PIL.Image
def transformation(row):
    try:
        img=PIL.Image.open(path0/row["filepath"])
        row["timestamp"]=img._getexif()[306]
        return row
    except:
        return 
merge[ (merge["timestamp"]=='-----')& (merge["filepath"].str.startswith("S1") | merge["filepath"].str.startswith("S2")) ].apply(transformation, axis=1)

Но это не работает, потому что операция нарезки возвращает мне копию:

>>>merge[(merge["timestamp"]=='-----')& (merge["filepath"].str.startswith("S1") | merge["filepath"].str.startswith("S2")) ]._is_view
>>>False

Как я могу изменить поведение панд, чтобы получить представление?

1 Ответ

0 голосов
/ 09 марта 2019

вы можете применить свою функцию и использовать обновление, но вам нужно вернуть ряд в вашей функции:

# sample df
# df = pd.read_clipboard()
# df.iloc[0:1, 1] = 'some value'

                           filepath   timestamp label_x  label_y   X   Y   W  \
0  S6/N11/N11_R1/S6_N11_R1_IMAG0274  some value   empty      NaN NaN NaN NaN   
1  S6/N11/N11_R1/S6_N11_R1_IMAG0275       -----   empty      NaN NaN NaN NaN   
2  S6/N11/N11_R1/S6_N11_R1_IMAG0276       -----   empty      NaN NaN NaN NaN   
3  S6/N11/N11_R1/S6_N11_R1_IMAG0277       -----   empty      NaN NaN NaN NaN   

    H  
0 NaN  
1 NaN  
2 NaN  
3 NaN  

теперь используйте update и apply с loc

# your function
def myFunc(row):
    row['timestamp'] = 'some new value' # set new value to timestamp
    return row['timestamp'] # return a series

# use update and apply your function 
df['timestamp'].update(df.loc[2:3].apply(myFunc, axis=1))
# you would change df.loc[2:3] to your boolean
# df.loc[((df["timestamp"]=='-----') & (df['filepath'].str.startswith('S1') | df['filepath'].str.startswith('S2')))]

Out

                           filepath       timestamp label_x  label_y   X   Y  \
0  S6/N11/N11_R1/S6_N11_R1_IMAG0274      some value   empty      NaN NaN NaN   
1  S6/N11/N11_R1/S6_N11_R1_IMAG0275           -----   empty      NaN NaN NaN   
2  S6/N11/N11_R1/S6_N11_R1_IMAG0276  some new value   empty      NaN NaN NaN   
3  S6/N11/N11_R1/S6_N11_R1_IMAG0277  some new value   empty      NaN NaN NaN   

    W   H  
0 NaN NaN  
1 NaN NaN  
2 NaN NaN  
3 NaN NaN  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...