Как объединить несколько фреймов данных в один и вывести его в CSV-файл в пандах? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть CSV-файл, который выглядит ниже

,date,location,device,provider,cpu,mem,load,drops,id,latency,gw_latency,upload,download,sap_drops,sap_latency,alert_id
0,2018-02-10 11:52:59.342269+00:00,CFE,10.0.100.1,BWE,6.0,23.0,11.75,0.0,,,,,,,,
1,2018-02-10 11:53:04.006971+00:00,CDW,10.0.100.1,GRE,6.0,23.0,4.58,0.0,,,,,,,,
2,2018-02-09 11:52:59.342269+00:00,,,SSD,,,10.45,,,,,,,,,
3,2018-02-08 09:52:59.342269+00:00,,,BWE,,,12.45,,,,,,,,,
4,2018-02-07 04:52:59.342269+00:00,,,RRW,,,9.45,,,,,,,,,
5,2018-02-06 05:52:59.342269+00:00,,,GRE,,,5.45,,,,,,,,,
6,2018-02-05 07:52:59.342269+00:00,,,SSD,,,13.45,,,,,,,,,
7,2018-02-04 10:52:59.342269+00:00,,,SSD,,,8.15,,,,,,,,,
8,2018-02-03 10:52:59.342269+00:00,,,GRE,,,4.15,,,,,,,,,
9,2018-02-02 06:52:59.342269+00:00,,,RRW,,,13.15,,,,,,,,,
10,2018-02-10 22:35:33.438948+00:00,QQW,10.12.11.1,VCD,4.0,23.0,5.0,0.0,,,,,,,,
11,2018-02-10 22:35:37.905242+00:00,CSW,10.12.11.1,VCD,4.0,23.0,6.08,0.0,,,,,,,,
.......................................................................................
.......................................................................................

Я загружаю CSV-файл, как показано ниже

df = pd.read_csv("metrics_copy.csv", parse_dates=["date"])   
df['device'] = df['device'].astype(str)
unique_devices = (np.unique(df[['device']].values))
unique_provider = np.unique(df[['provider']].values)

Я хочу получить CSV-файл, который содержит только определенные столбцыдля определенной комбинации.

for i in unique_devices:
    for j in ["cpu", "mem"]:
        df2 = df[(df['device'] == i)]
        df2["date"] = pd.to_datetime(df2["date"], format="%Y-%m-%d")
        print(df2[j])

Как видите, для каждой уникальной комбинации устройства и метрики я получу данные временного ряда. Я могу получить набор значений для df2[j] дляданное устройство. Я хочу вывести эти значения в CSV-файл для всех комбинаций, пока цикл продолжается. Мне известна концепция pd.concat, которую можно использовать, как показано ниже

df_final = pd.concat([df, df2, df3.....])

Но для этого мне нужно сгенерировать кадры данных для всех возможных комбинаций, а затем, наконец, объединить их, чтобы они стали одним кадром данных. Поэтому я хочу, чтобы файл csv конечного результата выглядел примерно так, как показано ниже для cpu

date cpu
...  ...
...  ...

Иеще один CSV-файл для mem, который выглядит примерно так:

date mem
...  ...
...  ...

Но я не уверен, как мне этого добиться. Любая помощь?

1 Ответ

0 голосов
/ 23 мая 2018

Адаптировано из следующего с использованием df.to_csv () в режиме добавления: Как добавить данные панд в существующий CSV-файл?

for i in unique_devices:
    for j in ["cpu", "mem"]:
        df2 = df[(df['device'] == i)]
        df2["date"] = pd.to_datetime(df2["date"], format="%Y-%m-%d")
            df2[['date',j]].to_csv('{}.csv'.format(j), mode='a', index=False, header=False)

В качестве альтернативы вы можете использовать оператор ifчтобы проверить, существует ли файл, поэтому при первом его создании будет использоваться заголовок, а затем он игнорируется:

for i in unique_devices:
    for j in ["cpu", "mem"]:
        df2 = df[(df['device'] == i)]
        df2["date"] = pd.to_datetime(df2["date"], format="%Y-%m-%d")
        import os
        if not os.path.isfile('{}.csv'.format(j)):
            df.to_csv('{}.csv'.format(j), mode='a', index=False)
        else:
            df2[['date',j]].to_csv('{}.csv'.format(j), mode='a', index=False, header=False)
...