【问题标题】:Python Pandas Dataframe Append RowsPython Pandas 数据框追加行
【发布时间】:2016-08-14 13:39:15
【问题描述】:

我正在尝试将数据框值附加为行,但将它们附加为列。我有 32 个文件,我想从中获取第二列(称为 dataset_code)并附加它。但它创建了 32 行和 101 列。我想要 1 列和 3232 行。

import pandas as pd
import os



source_directory = r'file_path'

df_combined = pd.DataFrame(columns=["dataset_code"])

for file in os.listdir(source_directory):
    if file.endswith(".csv"):
            #Read the new CSV to a dataframe.  
            df = pd.read_csv(source_directory + '\\' + file)
            df = df["dataset_code"]
            df_combined=df_combined.append(df)



print(df_combined)

【问题讨论】:

  • 你确定列是一样的吗?来自appenddocs:“将其他行附加到此帧的末尾,返回一个新对象。不在此帧中的列将添加为新列。”
  • 是的,当我对 df 进行子集化并打印时,它会打印相应的列

标签: python python-2.7 pandas dataframe


【解决方案1】:

您已经有两个非常好的答案,但让我提出几个建议。

  1. 如果您只想要dataset_code 列,请直接告诉pd.read_csv (usecols=['dataset_code']),而不是仅将整个文件加载到内存中以立即对数据帧进行子集化。
  2. 不是附加到最初为空的数据帧,而是收集数据帧列表并在最后一举将它们连接起来。将行附加到 pandas DataFrame 的成本很高(它必须创建一个全新的),因此您的方法会创建 65 个 DataFrames:一个在开头,一个在读取每个文件时,一个在附加每个文件时 -甚至可能还有 32 个,带有子集。我提出的方法只创建了其中的 33 个,并且是这种导入的常用习语。

代码如下:

import os
import pandas as pd

source_directory = r'file_path'

dfs = []
for file in os.listdir(source_directory):
    if file.endswith(".csv"):
        df = pd.read_csv(os.join.path(source_directory, file),
                        usecols=['dataset_code'])
        dfs.append(df)

df_combined = pd.concat(dfs)

【讨论】:

  • 谢谢 Alberto,我已将您的答案更改为已接受的答案,因为它是更好的解决方案
【解决方案2】:

df["dataset_code"]Series,而不是 DataFrame。由于要将一个 DataFrame 附加到另一个 DataFrame,因此需要将 Series 对象更改为 DataFrame 对象。

>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> type(df['dataset_code'])
<class 'pandas.core.series.Series'>

要进行转换,请执行以下操作:

df = df["dataset_code"].to_frame()

【讨论】:

  • 嘿内哈尔,这工作,谢谢!但为什么它起作用了?你能帮我理解吗?
【解决方案3】:

或者,您可以创建一个带有双方括号的数据框:

df = df[["dataset_code"]]

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 2014-10-20
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多