从多个 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')
我有多个具有相同列 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')