从多个 CSV 文件中获取单列并将它们作为新列放入数据框中

Take single column from multiple CSV files and place them as new columns in dataframe

我有多个具有相同列 headers 的 CSV 文件,如下所示:

|      Date & Time      |  Rain |    Flow    |
| --------------------- | ----- | ---------- |
|    3/19/2018 12:00    |   0   |    0.51    |
|    3/19/2018 13:00    |   2   |    0.51    |
...

我想从每个 CSV 中取出 'Flow' 列,并根据日期将它们并排放置。我面临的问题是每个 CSV 的日期和时间都不同,我想根据日期对齐列,如果合并时该日期没有值,我想留空 space或 NaN

我创建了一个包含日期范围的新数据框,其中封装了 CSV 列表中找到的所有日期,但我无法相应地合并列。

最终数据框看起来像

|      Date & Time      |    CSV 1 Flow    |    CSV 2 Flow    |    CSV 3 Flow    |
| --------------------- | ---------------- | ---------------- | ---------------- |
|    3/19/2018 12:00    |       0.51       |        NaN       |       0.34       |
|    3/19/2018 13:00    |       0.51       |        NaN       |       0.47       |
...

到目前为止我尝试过的看起来像:

csv_files = glob.glob(os.path.join(pwd, "*.csv"))
range = pd.date_range('2017-01-01', periods=45985, freq='H')
df_full = pd.DataFrame({'Date & Time': range})

for j in csv_files:
   df_full[j]=''
   df_hourly = pd.read_csv(j, usecols=['Date & Time','Flow'])
   df_merged = pd.merge(df_full, df_hourly, on='Date & Time', how='left')

我得到的代码如下所示:

range = pd.date_range('2017-01-01', periods=45985, freq='H')
df_full = pd.DataFrame({'Date & Time': range})
for filename in csv_files:
  df_full[filename] = ''
  df = pd.read_csv(filename,header=0, parse_dates=['Date & Time'], 
  usecols=['Date & Time', 'Flow'])
  df_combined = pd.merge(left=df_full,right=df, on='Date & Time', how='outer')
df_combined

给出的输出 DF 看起来像

|      Date & Time      |   CSV 1 Filepath |   CSV 2 Filepath |...    | - Flow- |
| --------------------- | ---------------- | ---------------- |...    | ------- |
|    01/01/2017 00:00   |      BLANK       |      BLANK       |...    |   0.34  |
|    01/01/2017 01:00   |      BLANK       |      BLANK       |...    |   0.25  |
...

除最后一列标记为 'Flow' 外,整个 table 都是空白的。脚本似乎没有将值放在正确的列中。

尝试这样的事情:

df1 = pd.read_csv('example.csv', parse_dates=['Date & Time'])
df2 = pd.read_csv('example.csv', parse_dates=['Date & Time'])
df_all = df1.merge(df2, on='Date & Time', how='left')

print(df_all)

输出:

          Date & Time  Rain_x  Flow_x  Rain_y  Flow_y
0 2018-03-19 12:00:00       0    0.51       0    0.51
1 2018-03-19 13:00:00       2    0.51       2    0.51

你的循环大概是这样的:

csv_files = glob.glob(os.path.join(pwd, "*.csv"))

df_all = pd.read_csv(csv_files[0], parse_dates=['Date & Time'], usecols=['Date & Time','Flow'])

for file in csv_files[1:]:
    df = pd.read_csv(file, parse_dates=['Date & Time'], usecols=['Date & Time','Flow'])
    df_all = df_all.merge(df, on='Date & Time', how='left')