为什么列和值数据在 pd.concat 中丢失?

Why are columns and values data lost in pd.concat?

用户体验
我是最近的工程专业(不是 C.S)毕业生,基本精通 MATLAB。我之前没有使用 Python/Jupyter 的经验。我已经搜索过 SO 和 google 寻求帮助,但找不到类似的问题。该项目的代码基于以下文章: https://medium.com/@shahrezanjum/using-python-to-automate-fantasy-football-stats-in-madden-ff9020fc2d2d

动机
Madden 是一款 NFL 视频游戏。在特许经营模式下,玩家可以在同一个联赛中作为不同的球队进行合作。 Madden 能够将这个联盟的球员统计数据输出为 CSV 文件。 CSV 文件是独立的,并按周和团队组织在文件夹中。因此,此输出格式需要修改才能执行数据分析。 See Madden output structure here

问题陈述
objective就是将这些CSV拼接成一个CSV文件,方便数据分析。 Madden CSV 列顺序不相同。 到目前为止,我的代码有两个问题: 1) 仅第一个数据帧缺少第一列“defCatchAllowed”的值。 2)列“fullName”的值在第一个之后的每个数据帧中都缺少值。

代码攻略
与 link 中的代码不同,我看到 3 objective 代码:

  1. 查找给定一周的所有 CSV 文件。
  2. 用零值填充空白单元格。
  3. 连接 CSV 文件。 (Concat 可以对列进行排序,因此 df 的不同 col 顺序是可以的。)

这是我目前的代码:

-从 CSV 创建 DF(仅从 3 个 df 开始,将在代码运行时添加所有团队)

df1 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/49ers/player-stats.csv", \
              index_col=[0], parse_dates=[0], engine = 'python')
df2 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/Bears/player-stats.csv", \
              index_col=[0], parse_dates=[0], engine = 'python')
df3 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/Bengals/player-stats.csv", \
              index_col=[0], parse_dates=[0], engine = 'python')

-重置索引(我不认为这是必要的,因为 concat 可以对列进行排序,但将其注释掉会导致更多问题)

list_dataframes = [df1, df2, df3]
for dataframe in list_dataframes:
dataframe.reset_index(drop = True, inplace = True)

- 用 0 填充 NaN 值。

list_dataframes3 = [df1, df2, df3]
for dataframe in list_dataframes3:
dataframe.fillna(value = 0, inplace = True)

-连接 dfs

finaldf = pd.concat([df1, df2, df3], sort = True)

输出
CSV output file. Highlighted cells indicate problem areas.

杂念
起初我以为 defCatchAllowed 是第一列有问题,所以我创建了一个 for 循环以在前面添加一个额外的列以用零填充以避免该问题,但这没有用。

我尝试按照 linked 文章所述重新索引列,但这产生的输出与上面代码已经产生的输出没有不同。Reindexing that does not appear to do anything.

基于 SO 搜索和 google 我找不到这个问题的答案。有兴趣听取更多有经验的用户关于我应该在哪里寻找故障排除的想法。

我是 SO 的新手,所以如果我遗漏了任何信息,请告诉我。感谢您的反馈。

根据建议更新
我尝试了选项 3 - 采用通用的列顺序。

我使用此代码对列重新排序

我收到此错误代码,告诉我“defCatchAllowed”不在索引中。我没意见,所以我从重新排序的列中删除了“defCatchAllowed”,然后它抛出相同的错误代码,但对于“全名”。我不确定下一步该去哪里。

解决方案
根据接受的解决方案,我将代码更新为循环附加每个数据帧而不进行排序。完成后,我会为生成的 df 重置索引。我们还发现,当将 CSV 读入数据框时,index_col=0 会产生第一列(defCatchAllowed 或 fullName)数据丢失的问题。从读取 CSV 步骤中删除此代码后,代码现在可以按预期工作:

from os import chdir
from glob import glob
import pandas as pd
from IPython.display import display

df1 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/49ers/player-stats.csv", \
              parse_dates=[0], engine = 'python')

list_dataframes = [df1, df2, df3]
for dataframe in list_dataframes:
dataframe.reset_index(drop = True, inplace = True)

list_dataframes3 = [df1, df2, df3]
for dataframe in list_dataframes3:
dataframe.fillna(value = 0, inplace = True)

final_df = pd.DataFrame()
list_dataframes10 = [df1, df2, df3]
for dataframe in list_dataframes10:
final_df = final_df.append(dataframe, sort=False)
final_df = final_df.reset_index(drop=True)

output_df = final_df.fillna(value = 0)

output_df.to_csv(r"/Users/Justin/Desktop/MADSTADT/OUTPUTHERE/Reciever")

核心问题是在 [df1,df2, df3] 中有一组不相交的列...需要将这些列整理成一组规范化的列?如果这不是问题,请到此为止。

建议为下游分析定义norm set of columns。选项是:

  1. 删除每个 df 中不需要的列
  2. 将 N 个差异列重命名为 1 个规范化列名称和格式
  3. 将所有规范化为通用格式
  4. 将所有 similiar 列归类为统一标识符...例如名字 + 全名 -> playerID

除此之外,还要看具体情况。吵得乱七八糟。

如果你追加,我相信它应该正确地配对列,如果一个有一个列而另一个没有,它会添加那个列(但显然在没有的数据框中将为空没有:

此外,不要指定索引,只需在 csvs 中读取即可:

尝试:

df1 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/49ers/player-stats.csv")
df2 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/Bears/player-stats.csv")
df3 = pd.read_csv(r"/Users/Justin/Desktop/MADSTADT/stats/reg/PullHere/Bengals/player-stats.csv")


final_df = pd.DataFrame()
list_dataframes = [df1, df2, df3]
for dataframe in list_dataframes:
    final_df = final_df.append(dataframe, sort=False)

final_df = final_df.reset_index(drop=True)