2016-06-04 2 views
0

У меня есть два CSV файлов в папке, первый из которых выглядит следующим образом:Заполнение Dataframe так строки заполняются последовательно

df1

Value Count 
1  10 
2  1 
3  2 
4  15 
5  8 

и второй из которых, как это:

df2

Value Count 
1  5 
2  22 
3  13 
4  16 
5  11 
6  18 

Я хочу Value в каждом из них, чтобы соответствовать. По сути, я хочу, чтобы превратить df1 в этом:

Value Count 
    1  10 
    2  1 
    3  2 
    4  15 
    5  8 
    6  0 

даже если Value 6 не существует в df1 Я хочу, чтобы она заселена с нулем.

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

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

и я пытались добавить это на:

df=df.append({'Value': '6', 'Count': '0'}, ignore_index=True) 

, но это добавляет новую строку в df2, а также которые я хочу избежать.

У меня есть около 20 файлов csv в папке, и я просто хочу, чтобы Value соответствовал всем им и был заполнен 0, если конкретный Value нет.

+0

Можете ли вы сделать его более явным, какие df1 и df2 в вашем коде? Я вижу, что вы читаете csv, но где находится DataFrame назначения? – pekapa

+0

нет фактических 'df1' и' df2', так как он читается в цикле, все просто называется 'df'. Это строка, которая диктует это: 'df = pd.read (csv (os.path.join (pth, f)". На данный момент нет кадра назначения. Каждый файл затем на данный момент просто называется 'df' –

+0

В конечном итоге я хочу объединить все добавленные список 'df'by и используя что-то вроде этого:' df_final = reduce (lambda left, right: pd.merge (left, right, on = ['Value'], how = ' external '), list1) ', но сначала мне нужно сделать« значение »согласованным между файлами. –

ответ

1

Это очень легко сделать using reindex. Сначала вы устанавливаете индекс каждого df равным его собственному столбцу Value. Затем reindex на основе большего (df2).

import numpy as np 
import pandas as pd 

# Create dfs and change their indices to use the `Value` column. 
df1 = pd.DataFrame({'Value': np.arange(1,6), 'Count': [10, 1, 2, 15, 8]}) 
df1.index = df1.Value 
df1.drop(['Value'], axis=1, inplace=True) 

df2 = pd.DataFrame({'Value': np.arange(1,7), 'Count': [5, 22, 13, 16, 11, 18]}) 
df2.index = df2.Value 
df2.drop(['Value'], axis=1, inplace=True) 

# Reindex with desired fill_value 
df1 = df1.reindex(index=df2.index, fill_value=0) 

     Count 
Value 
1   10 
2   1 
3   2 
4   15 
5   8 
6   0 
2
from glob import glob 
filenames = glob('C:/pathway/*.csv') 

def rfile(fn): 
    return pd.read_csv(fn, index_col=0) 

dfs = [rfile(fn) for fn in filenames] 
idx = dfs[0].index 
for i in range(1, len(dfs)): 
    idx = idx.union(dfs[i].index) 

idx теперь ваш индекс, который является объединением всех индексов во всех файлах. reindex любой из отдельных кадров данных следующим образом, чтобы получить то, что вы хотите.

df = dfs[0].reindex(idx, fill_value=0) 
+0

, поскольку он считывается в цикле, все они фактически называются' df'. Я просто использовал 'df1' и' df2' в качестве примера e –

+0

edit возвращает 1 dataframe с суммой 'Count' для каждого' Value' из каждого отдельного файла csv, а не того, что я действительно ищу. –

+0

Я добавил '.csv' в конец пути. На самом деле это плохой способ управления файловыми входами. Я должен угадать, что есть и не находится в каталоге, который вы используете.Вы сказали, что есть только два файла, правильно? Во всяком случае, мы надеемся, что это исправит. – piRSquared