![](/img/trans.png)
[英]Incrementing a cell value in pandas dataframe based on multiple column conditions
[英]Insert pandas dataframe value based on multiple column conditions
在 python 中,我有一個名為files_in_folder
的 68K 文件列表。 此外,我有一個帶有文件名和擴展名的 csv 文件(pd 數據框)。 一個例子:
import pandas as pd
import os
files_in_folder = ['2.fds', '4.fds', '5.jpg']
df = pd.DataFrame({'filename': ['1.fds', '2.fds', '3.fds', '4.fds', '5.jpg'],
'correct_extension?': [None, None, None, None, None],
'extension': ['.fds', None, '.json', '.fds', '.jpg']
})
對於列表中的每個項目,我檢查文件是否在“文件名”列中。 如果正確的擴展名在“extension”列中,則應在“correct_extension”列中添加True
? 在那一排。
在堆棧上,我發現了 numpy 的“位置”,它可以做這樣的事情:
for file in files_in_folder:
extension = os.path.splitext(file)
df['correct_extension?'] = np.where( ( (df['filename'] == file) & (df['extension'] == extension ) ) , True, False)
但是,由於我的循環,這種方法沒有給出預期的結果(如下)。 我正在尋找可以給我提示如何解決此問題的人,最好是使用循環。
我非常渴望向你學習。
expected result: dataframe ->
'filename': ['1.fds', '2.fds', '3.fds', '4.fds', '5.jpg'],
'correct_extension?': [None, None, None, True, True],
'extension': ['.fds', None, '.json', '.fds', '.jpeg']
我發現的一個類似主題是: Pandas:如何根據現有列的多個條件分配值?
您可以通過在extension
列中使用擴展中的正則表達式來使用 str.extract
rexp = '|'.join([ext for ext in df['extension'] if ext is not None])
df['correct_extension?'] = (
(df['filename'].isin(files_in_folder)) &
(df['filename'].str.extract('('+ rexp +')', expand=False) == df['extension'])
)
我不知道你為什么想要 for 循環,但如果你需要一個健壯的方法 - 即使你的filename
名列中有重復的文件名,這也是一種方法:
for file in files_in_folder:
extension = os.path.splitext(file)
idxs = df.loc[df['filename']==file, 'extension'].index
for idx in idxs:
df.iloc[idx]['correct_extension?'] = (df.iloc[idx]['filename']==file) &
(df.iloc[idx]['extension']==extension[1])
打印(df):
filename correct_extension? extension
0 1.fds False .fds
1 2.fds False None
2 3.fds False .json
3 4.fds True .fds
4 5.fds False None
我們試試看
df['correct_extension?'].update(df[df['filename'].isin(files_in_folder) & df['extension'].notna()]
.apply(lambda row: row['filename'].endswith(row['extension']), axis=1))
print(df)
filename correct_extension? extension
0 1.fds None .fds
1 2.fds None None
2 3.fds None .json
3 4.fds True .fds
4 5.fds None None
如果你真的想要循環
df['correct_extension?'] = np.array([np.where( (df['filename'] == f) & (df['extension'] == '.fds'), True, None)
for f in files_in_folder]).any(axis=0)
print(df)
filename correct_extension? extension
0 1.fds None .fds
1 2.fds None None
2 3.fds None .json
3 4.fds True .fds
4 5.fds None None
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.