【问题标题】:Pandas: Concatenate files but skip the headers except the first filePandas:连接文件但跳过第一个文件以外的标题
【发布时间】:2021-07-05 04:53:12
【问题描述】:

我有 3 个文件代表相同的数据集,分成 3 个,我需要连接:

import pandas

df1 = pandas.read_csv('path1')
df2 = pandas.read_csv('path2')
df3 = pandas.read_csv('path3')

df = pandas.concat([df1,df2,df3])

但这会将标题保留在数据集的中间,我需要从第二个和第三个文件中删除标题(列名)。我该怎么做?

【问题讨论】:

  • 我不明白 - skiprows=1 解决方案怎么可能有效?因为 concat 按第一个数据帧对齐数据,如果从第二个和第三个数据帧中删除列名,它无法对齐。还是缺少什​​么?
  • 你说得对,我检查的是跳行,而不是连接。绝对skirows代码不是正确的,数据集应该有23列,几乎是它的3倍。

标签: python pandas


【解决方案1】:

我认为你需要 numpy.concatenateDataFrame 构造函数:

df = pd.DataFrame(np.concatenate([df1.values, df2.values, df3.values]), columns=df1.columns)

另一种解决方案是替换 df2df3 中的列名:

df2.columns = df1.columns
df3.columns = df1.columns
df = pd.concat([df1,df2,df3], ignore_index=True)

样本

np.random.seed(100)
df1 = pd.DataFrame(np.random.randint(10, size=(2,3)), columns=list('ABF'))
print (df1)
   A  B  F
0  8  8  3
1  7  7  0

df2 = pd.DataFrame(np.random.randint(10, size=(1,3)), columns=list('ERT'))
print (df2)
   E  R  T
0  4  2  5

df3 = pd.DataFrame(np.random.randint(10, size=(3,3)), columns=list('HTR'))
print (df3)
   H  T  R
0  2  2  2
1  1  0  8
2  4  0  9

print (np.concatenate([df1.values, df2.values, df3.values]))
[[8 8 3]
 [7 7 0]
 [4 2 5]
 [2 2 2]
 [1 0 8]
 [4 0 9]]

df = pd.DataFrame(np.concatenate([df1.values, df2.values, df3.values]), columns=df1.columns)
print (df)
   A  B  F
0  8  8  3
1  7  7  0
2  4  2  5
3  2  2  2
4  1  0  8
5  4  0  9

df = pd.concat([df1,df2,df3], ignore_index=True)
print (df)
   A  B  F
0  8  8  3
1  7  7  0
2  4  2  5
3  2  2  2
4  1  0  8
5  4  0  9

【讨论】:

  • 如果文件已经具有相同的标题,您知道为什么需要添加 df2.columns = df1.columns 吗?
  • 如果列相同,那么您的解决方案应该可以完美运行 - 按列连接对齐数据。
  • 您的代码运行良好。我只是在想为什么熊猫坚持让我在使用 ignore_index=True 之前制作 df2.columns = df1.columns
  • 我认为你的列名不同,所以需要我的解决方案。但如果列名相同,则只需要df = pd.concat([df1,df2,df3], ignore_index=True)
  • 列是相同的,我用 all(df2.columns == df1.columns) 检查它并返回 True。但是当我运行 df = pd.concat([df1,df2,df3], ignore_index=True) 行时,它只会复制列,只有当我使用你的完整代码(包括替换列)时它才能工作
【解决方案2】:

第二行和第三行必须使用 skip_rowsread_csv 参数,如下所示:

import pandas

df1 = pandas.read_csv('path1')
df2 = pandas.read_csv('path2', skiprows=1)
df3 = pandas.read_csv('path3', skiprows=1)

df = pandas.concat([df1,df2,df3])

【讨论】:

  • 我同意 Jezrael 的观点,连接复制列的次数与文件的次数一样多。我有点太快了,我很高兴看到第一行消失了,但没有检查右边的列号变大了
【解决方案3】:

我最近一直在做这个,这是我想出的最紧凑/优雅的东西:

import pandas as pd

frame_list=[df1, df2, df3]
frame_mod=[frame_list[i].iloc[0:] for i in range(0,len(frame_list))]
frame_frame=pd.concat(frame_mod)

【讨论】:

    【解决方案4】:

    用途:

    df = pd.merge(df1, df2, how='outer')
    

    合并出现在 df1 和 df2 中的一个或两个中的行(联合)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-28
      • 2019-03-04
      • 2021-11-05
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多