簡體   English   中英

根據多列條件插入 pandas dataframe 值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM