Фильтрация в фрейме данных pandas не работает

#python #pandas #csv

#python #pandas #csv

Вопрос:

Я пытаюсь объединить 3 CSV-файла в один, используя фрейм данных panda. Рассмотрим приведенный ниже пример

data1.csv
data2.csv
data3.csv

Итак, мне нужно объединить выше CSV в один. Это реализовано с помощью приведенного ниже кода

 if os.path.isfile(data1.csv) and os.path.isfile(data2.csv) and os.path.isfile(data3.csv):
    df1 = pd.read_csv(data1.csv)
    df2 = pd.read_csv(data2.csv)
    df3 = pd.read_csv(data3.csv)
    self.combined_data_frame = pd.concat([df1, df2, df3], ignore_index=True)
    self.combined_data_frame = pd.DataFrame(self.combined_data_frame, columns=['col1', 'col2', 'col3'])
    result = self.combined_data_frame.loc[(self.combined_data_frame['col3'] == 'FALSE')]
    result.to_csv(data4.csv)
  

Несмотря на то, что я могу объединить CSV в один, не удалось отфильтровать строки на основе условия. Когда я попробовал приведенный выше фрагмент кода, я получил предупреждение ниже, а data4.csv не содержит ничего, кроме заголовков

 (venv) C:Usersedward_arrowpath_to_location>python runscript.py
C:Usersedward_arrowpath_to_locationvenvlibsite-packagespa
ndascorecomputationexpressions.py:68: FutureWarning: elementwise comparison f
ailed; returning scalar instead, but in the future will perform elementwise comp
arison
  return op(a, b)
  

Могу ли я узнать, как я могу решить эту проблему, чтобы выполнить мое требование, или же есть какой-либо другой метод для реализации с использованием python.

Ваши подсказки и решение приветствуются #ОБНОВИТЬ Это исключенный результат конечный результат

Ответ №1:

  • Используйте pathlib для поиска файлов
  • Используйте list-comprehension с pandas.read_csv , чтобы создать список фреймов данных и объединить их все с pd.concat
    • Обратите внимание, что 'FALSE' и 'TRUE' были преобразованы в False и True соответственно и являются bool , а не str типом.
    • В качестве альтернативы используйте pd.concat([pd.read_csv(file, dtype={'col3': str}) for file in files]) , который будет сохраняться col3 как str , а затем по-прежнему фильтровать для 'FALSE' .
  • Фильтруйте фрейм данных с помощью Pandas: Boolean Indexing
    • Фильтр должен фильтровать для False , а не 'FALSE' .
  • Сохраните фрейм данных с помощью pandas.DataFrame.to_csv
  • Текущая версия pandas является 1.1.0 .
 from pathlib import Path
import pandas as pd

# find the files
files = Path('c:/users/some_path/to_files').glob('data*.csv')

# create a dataframe of all the files
df = pd.concat([pd.read_csv(file) for file in files]).reset_index(drop=True)

# display(df)
    col1  col2   col3
0      1     2  False
1      1     2  False
2      1     2   True
3      1     2  False
4      3     4  False
5      3     4   True
6      3     4   True
7      3     4   True
8      6     7  False
9      6     7  False
10     6     7  False
11     6     7  False

# filter the data for False
df_false = df[df.col3 == False]

# save the file
df_false.to_csv('false.csv', index=False)
  

Ответ №2:

Хорошо, я возьму эти 3 фрейма данных, объединю их и отфильтрую с помощью ~ для col3:

 import pandas as pd

df1 = pd.DataFrame({
           'col1':[1,1,1,1],
           'col2':[2,2,2,2], 
           'col3':[False, True, False, True]
         })
print(df1)
   col1  col2   col3
0     1     2  False
1     1     2   True
2     1     2  False
3     1     2   True

df2 = pd.DataFrame({
           'col1':[3,3,3,3],
           'col2':[4,4,4,4], 
           'col3':[False, True, True, True]
         })
print(df2)
   col1  col2   col3
0     3     4  False
1     3     4   True
2     3     4   True
3     3     4   True

df3 = pd.DataFrame({
           'col1':[6,6,6,6],
           'col2':[7,7,7,7], 
           'col3':[False, False, False, False]
         })
print(df3)
   col1  col2   col3
0     6     7  False
1     6     7  False
2     6     7  False
3     6     7  False

combined_data_frame = pd.concat([df1, df2, df3], ignore_index=True)
print(combined_data_frame)
    col1  col2   col3
0      1     2  False
1      1     2   True
2      1     2  False
3      1     2   True
4      3     4  False
5      3     4   True
6      3     4   True
7      3     4   True
8      6     7  False
9      6     7  False
10     6     7  False
11     6     7  False

final_data_frame = combined_data_frame[~combined_data_frame.col3]
print(final_data_frame)
    col1  col2   col3
0      1     2  False
2      1     2  False
4      3     4  False
8      6     7  False
9      6     7  False
10     6     7  False
11     6     7  False

final_data_frame.to_csv('final_data_frame.csv', index=False)
  

Конечный файл соответствует вашему ожидаемому результату (index= False).

Ответ №3:

Похоже, у вас есть дополнительный набор круглых скобок в инструкции:

 result = self.combined_data_frame.loc[(self.combined_data_frame['col3'] == 'FALSE')]
  

Попробуйте использовать это вместо :

 result = self.combined_data_frame.loc[self.combined_data_frame['col3'] == 'FALSE']
  

Комментарии:

1. вы хотите: result = self.combined_data_frame.loc[~self.combined_data_frame['col3']]