Разделите информационный кадр данных и вставьте столбец - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть большой набор файлов с отметками даты, имена файлов которых являются датами.Каждый файл имеет набор записей с одинаковой структурой, который находится в dataframe.

. Я хотел бы превратить их в один dataframe с именем файла в виде столбца в нем.

Пример кода приведен ниже.

import pandas as pd
import numpy as np
df1 = pd.DataFrame({
    'a': np.random.rand(6),
    'b': np.random.choice([4,9,np.nan], 6),
})

df2 = df1*3
df3 = np.sqrt(df2)
df4 = df1*df3
df5 = df2*0.5
df6 = df2*df2

df = pd.DataFrame({
    'fname': pd.date_range('1/1/2018', periods=6, freq='D'),
    'df': [df1, df2, df3, df4, df5, df6]
})

Ожидаемый выходной df:

    a           b   fname
0   0.634776    NaN 2018-01-01
1   0.616349    NaN 2018-01-02
2   0.502559    NaN 2018-01-03
3   0.545378    4.0 2018-01-04
4   0.658668    4.0 2018-01-05
5   0.822417    9.0 2018-01-06
0   1.904328    NaN 2018-01-01
1   1.849046    NaN 2018-01-02
2   1.507678    NaN 2018-01-03
3   1.636133    2.0 2018-01-04
4   1.976004    2.0 2018-01-05
5   2.467252    3.0 2018-01-06
...and so on...

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Чтобы собрать вместе кадры данных, я думаю, что вы должны использовать pd.Concat: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html

Какой код вы используете для чтения данных?Если это что-то вроде этого

file_name = os.listdir(path)
file_name = [file_name for file_name in glob.glob('* *')]
df = pd.DataFrame()
dfs = []
for file_name in file_name:
data = pd.read_csv(file_name, 'Sheet1')


data['DateTime'] = pd.to_datetime(file_name[:10])
dfs.append(data)

df = pd.concat(dfs, ignore_index=True)

Где имя_файла [: 10] получает дату из файлов на основе количества символов

0 голосов
/ 03 декабря 2018

Я думаю, лучше создать dict, поэтому можно использовать concat:

d = dict(zip(pd.date_range('1/1/2018', periods=6, freq='D'),
              [df1, df2, df3, df4, df5, df6]))

df = (pd.concat(d)
       .reset_index(level=1, drop=True)
       .rename_axis('fname')
       .reset_index()
       )

или передать список DataFrames в concat с параметром keys:

df = (pd.concat([df1, df2, df3, df4, df5, df6], 
               keys=pd.date_range('1/1/2018', periods=6, freq='D'))
       .reset_index(level=1, drop=True)
       .rename_axis('fname')
       .reset_index()
       )

print (df.head(10))
       fname         a     b
0 2018-01-01  0.075056   9.0
1 2018-01-01  0.646019   9.0
2 2018-01-01  0.656301   NaN
3 2018-01-01  0.420031   4.0
4 2018-01-01  0.239017   9.0
5 2018-01-01  0.921222   NaN
6 2018-01-02  0.225168  27.0
7 2018-01-02  1.938057  27.0
8 2018-01-02  1.968903   NaN
9 2018-01-02  1.260093  12.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...