Добавление двух таблиц panda с одинаковыми столбцами создает другой столбец? [Дубликат]

Ошибка произошла здесь из-за использования одинарных кавычек ('). Вы можете поместить свой запрос следующим образом:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Он использует mysql_real_escape_string для предотвращения SQL-инъекции. Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и более поздних версий), но для более старых версий mysql_real_escape_string это будет трюк.

184
задан Andy Hayden 20 December 2015 в 08:25
поделиться

8 ответов

Если у вас есть одинаковые столбцы во всех файлах csv, вы можете попробовать код ниже. Я добавил header=0, чтобы после чтения csv первая строка могла быть назначена как имена столбцов.

path =r'C:\DRO\DCL_rawdata_files' # use your path
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    list_.append(df)
frame = pd.concat(list_)
202
ответ дан ppaulojr 5 September 2018 в 07:00
поделиться

Альтернатива ответам darindaCoder :

path = r'C:\DRO\DCL_rawdata_files'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent

df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)
# doesn't create a list, nor does it append to one
162
ответ дан Community 5 September 2018 в 07:00
поделиться
import glob, os    
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "my_files*.csv"))))
19
ответ дан Jose Antonio Martin H 5 September 2018 в 07:00
поделиться

Библиотека Dask может считывать данные из нескольких файлов:

>>> import dask.dataframe as dd
>>> df = dd.read_csv('data*.csv')

(Источник: http://dask.pydata.org/en/latest/examples/dataframe-csv. html )

Dataframes Dask реализует подмножество API-интерфейсов данных Pandas. Если все данные вписываются в память, вы можете вызвать df.compute() , чтобы преобразовать данные в рамку данных Pandas.

6
ответ дан Jouni K. Seppänen 5 September 2018 в 07:00
поделиться

Если несколько файлов csv заархивированы, вы можете использовать zip-файл для чтения всех и конкатенации, как показано ниже:

import zipfile
import numpy as np
import pandas as pd

ziptrain = zipfile.ZipFile('yourpath/yourfile.zip')

train=[]

for f in range(0,len(ziptrain.namelist())):
    if (f == 0):
        train = pd.read_csv(ziptrain.open(ziptrain.namelist()[f]))
    else:
        my_df = pd.read_csv(ziptrain.open(ziptrain.namelist()[f]))
        train = (pd.DataFrame(np.concatenate((train,my_df),axis=0), 
                          columns=list(my_df.columns.values)))
3
ответ дан leon 5 September 2018 в 07:00
поделиться
filepaths = ['data/d1.csv', 'data/d2.csv','data/d3.csv','data/d4.csv']
df = pd.concat(map(pd.read_csv, filepaths))
2
ответ дан robmsmt 5 September 2018 в 07:00
поделиться

Изменить: я googled мой путь в https://stackoverflow.com/a/21232849/186078 . Однако в последнее время я нахожу быстрее выполнять любые манипуляции с помощью numpy, а затем назначая его один раз в dataframe, а не манипулируя самим фреймворком на итеративной основе, и, похоже, он тоже работает в этом решении.

искренне хочу, чтобы кто-то нажал эту страницу, чтобы рассмотреть этот подход, но не хочу прикладывать эту огромную часть кода в качестве комментария и сделать его менее читаемым.

Вы можете использовать numpy, чтобы действительно ускорить конкатенацию файловой системы.

import os
import glob
import pandas as pd
import numpy as np

path = "my_dir_full_path"
allFiles = glob.glob(os.path.join(path,"*.csv"))


np_array_list = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    np_array_list.append(df.as_matrix())

comb_np_array = np.vstack(np_array_list)
big_frame = pd.DataFrame(comb_np_array)

big_frame.columns = ["col1","col2"....]

Статистика синхронизации:

total files :192
avg lines per file :8492
--approach 1 without numpy -- 8.248656988143921 seconds ---
total records old :1630571
--approach 2 with numpy -- 2.289292573928833 seconds ---
10
ответ дан SKG 5 September 2018 в 07:00
поделиться

Если вы хотите искать рекурсивно ( Python 3.5 или выше ), вы можете сделать следующее:

from glob import iglob
import pandas as pd

path = r'C:\user\your\path\**\*.csv'

all_rec = iglob(path, recursive=True)     
dataframes = (pd.read_csv(f) for f in all_rec)
big_dataframe = pd.concat(dataframes, ignore_index=True)

Обратите внимание, что три последние строки могут быть выражены в одном single line:

df = pd.concat((pd.read_csv(f) for f in iglob(path, recursive=True)), ignore_index=True)

Здесь вы можете найти документацию ** здесь . Кроме того, я использовал iglob вместо glob, поскольку он возвращает итератор вместо списка.



EDIT: мультиплатформенная рекурсивная функция:

You (Linux, Windows, Mac), поэтому вы можете просто сделать это:

df = read_df_rec('C:\user\your\path', *.csv)

Вот функция:

from glob import iglob
from os.path import join
import pandas as pd

def read_df_rec(path, fn_regex=r'*.csv'):
    return pd.concat((pd.read_csv(f) for f in iglob(
        join(path, '**', fn_regex), recursive=True)), ignore_index=True)
5
ответ дан toto_tico 5 September 2018 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: