#python #pandas #csv
#python #pandas #csv
Вопрос:
Я пытаюсь объединить 3 CSV-файла в один, используя фрейм данных panda. Рассмотрим приведенный ниже пример
Итак, мне нужно объединить выше 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']]