2016-06-01 3 views
1

У меня есть папка с многочисленными CSV файлов, которые выглядят так:Объединение DataFrames внутри цикла

csv1

 2006 Percent  Land_Use 
    0  13 5.379564  Developed 
    1  8 25.781580 Grass/Pasture 
    2  4 54.265050   Crop 
    3  15 0.363983   Water 
    4  16 6.244104  Wetlands 
    5  6 4.691764   Forest 
    6  1 3.031494  Alfalfa 
    7  11 0.137424  Shrubland 
    8  5 0.003671   Vetch 
    9  3 0.055412   Barren 
    10  7 0.009531   Grass 
    11 12 0.036423   Tree 

csv2

2007 Percent  Land_Use 
0  13 2.742430  Developed 
1  4 56.007242   Crop 
2  8 24.227963 Grass/Pasture 
3  16 8.839979  Wetlands 
4  6 6.181062   Forest 
5  1 1.446668  Alfalfa 
6  15 0.366116   Water 
7  3 0.127760   Barren 
8  11 0.034426  Shrubland 
9  7 0.000827   Grass 
10 12 0.025528   Tree 

csv3

2008 Percent  Land_Use 
0 13 1.863809  Developed 
1  8 31.455578 Grass/Pasture 
2  4 57.896856   Crop 
3 16 2.693929  Wetlands 
4  6 4.417966   Forest 
5  1 1.239176  Alfalfa 
6  7 0.130849   Grass 
7 15 0.266536   Water 
8 11 0.004571  Shrubland 
9  3 0.030731   Barren 

и Я хочу объединить их все вместе в один D ataFrame на Land_Use

Я читаю в файлах, как это:

pth = (r'G:\') 
for f in os.listdir(pth): 
df=pd.read_csv(os.path.join(pth,f) 

, но я не могу понять, как объединить все отдельные dataframes после этого. Я понял, как их конкатенировать, но это не то, что я хочу. Тип слияния, который я хочу, - outer.

Если бы я был использовать путь к каждому файлу CSV я бы объединить их, как это, но я не хочу, чтобы установить путь к каждому файлу, есть многие из них:

one=pd.read_csv(r'G:\one.csv') 
    two=pd.read_csv(r'G:\two.csv') 
    three=pd.read_csv(r'G:\three.csv') 
    merge=pd.merge(one,two, on=['Land_Use'], how='outer') 
    mergetwo=pd.merge(merge,three,on=['Land_Use'], how='outer') 

ответ

2

Я думаю, что вы можете использовать в python 3:

import functools 

dfs = [df1,df2,df3] 

df = functools.reduce(lambda left,right: pd.merge(left,right,on='Land_Use',how='outer'),dfs) 
print (df) 
    2006 Percent_x  Land_Use 2007 Percent_y 2008 Percent 
0  13 5.379564  Developed 13.0 2.742430 13.0 1.863809 
1  8 25.781580 Grass/Pasture 8.0 24.227963 8.0 31.455578 
2  4 54.265050   Crop 4.0 56.007242 4.0 57.896856 
3  15 0.363983   Water 15.0 0.366116 15.0 0.266536 
4  16 6.244104  Wetlands 16.0 8.839979 16.0 2.693929 
5  6 4.691764   Forest 6.0 6.181062 6.0 4.417966 
6  1 3.031494  Alfalfa 1.0 1.446668 1.0 1.239176 
7  11 0.137424  Shrubland 11.0 0.034426 11.0 0.004571 
8  5 0.003671   Vetch NaN  NaN NaN  NaN 
9  3 0.055412   Barren 3.0 0.127760 3.0 0.030731 
10  7 0.009531   Grass 7.0 0.000827 7.0 0.130849 
11 12 0.036423   Tree 12.0 0.025528 NaN  NaN 

python 2 В:

df = reduce(lambda left,right: pd.merge(left,right,on='Land_Use',how='outer'),dfs) 

Рабочий раствор с glob:

import pandas as pd 
import functools 
import glob 

pth = 'a/*.csv' 
files = glob.glob(pth) 
dfs = [pd.read_csv(f, sep=';') for f in files] 

df = functools.reduce(lambda left,right: pd.merge(left,right,on='Land_Use', how='outer'),dfs) 
print (df) 
    2006 Percent_x  Land_Use 2008 Percent_y 2007 Percent 
0  13 5.379564  Developed 13.0 1.863809 13.0 2.742430 
1  8 25.781580 Grass/Pasture 8.0 31.455578 8.0 24.227963 
2  4 54.265050   Crop 4.0 57.896856 4.0 56.007242 
3  15 0.363983   Water 15.0 0.266536 15.0 0.366116 
4  16 6.244104  Wetlands 16.0 2.693929 16.0 8.839979 
5  6 4.691764   Forest 6.0 4.417966 6.0 6.181062 
6  1 3.031494  Alfalfa 1.0 1.239176 1.0 1.446668 
7  11 0.137424  Shrubland 11.0 0.004571 11.0 0.034426 
8  5 0.003671   Vetch NaN  NaN NaN  NaN 
9  3 0.055412   Barren 3.0 0.030731 3.0 0.127760 
10  7 0.009531   Grass 7.0 0.130849 7.0 0.000827 
11 12 0.036423   Tree NaN  NaN 12.0 0.025528 
+0

, но в моем цикле каждый файл данных называется 'df'. Как я могу назначить их 'df1',' df2', 'df3' и т. Д.? –

+0

Я знаю, что это не часть вопроса, но на самом деле у меня есть файлы, которые имеют «Land_Use» не в моем примере, например «Растительность». Этот метод исключает «Land_Use», потому что он не находится в файле 'left' или' right'. Есть ли возможность включить все «Land_Uses»? –

1

Я не разрешено комментировать, поэтому я не уверен, чего вы точно хотите. Вы можете использовать one.merge(two, on=['Land_Use'], how='outer').merge(three,on=['Land_Use'], how='outer'). Дайте мне знать, если вы хотите что-то еще.

Если у вас много данных, вы можете попробовать использовать функцию уменьшения. Сначала создайте список, содержащий все фреймы данных. dataframes = [one, two, three, four, ... , twenty]. Вы можете добавить их в список, используя списки, или добавив их в список в своем цикле. Тогда, если вы хотите, чтобы объединить их на основе Land_Use, вы можете использовать df_final = reduce(lambda left,right: pd.merge(left,right,on=['Land_Use'], how='outer'), dataframes)

Примечание: функция уменьшения в пакете functools в питона 3+

+0

В моей петле я читаю около 20 файлов. Я хочу объединить все 20 вместе в столбце «Land_Use» в цикле –

+0

Этот метод работает, но другой ответ более чист в своем представлении –

+0

, он также будет работать и в python 2. Вам нужно сначала определить список, называемый dataframes, а затем добавить ваши фреймы данных «один, два, три и т. Д.» В этот список –