如何按行实际拥有数据点的列对行进行分组?

玫瑰花

我什至不知道 groupby 是否是用于此的正确函数。有点难以理解,所以我会附上我的数据框的截图截图

基本上,这个数据框有太多的列,因为每一列只特定于一行或几行。您可以在屏幕截图中看到前几列特定于第一行,最后几列特定于最后一行。我想让它每一行都只有与它实际相关的列。我尝试了几种使用 groupby('equipment name') 的方法和使用 dropna 的几种方法,但没有一种方法可以满足我的需要。我也愿意将它分成多个数据帧。

任何方法都是可以接受的,这个错误一直让我发疯。我花了一段时间才达到这一点,因为这开始是一个难以理解的 10,000 行 json。我对编程也很陌生。

汤姆

这是一个非常酷的答案,可能是一种选择 - 它确实使用了groupby非常抱歉解雇!!!这会将您的数据分组到 DataFrame 中,其中每个 DataFrame 都有一组唯一的列,并且任何仅包含这些列的值的行都将位于该 DataFrame 中。如果您的数据中有多组行共享完全相同的列,我认为此解决方案是理想的。

但是请注意,如果您的空值在整个数据集中更随机地分布,或者如果一组行中的一行缺少单个条目(与相关行相比),您最终会得到更多唯一非-null 列,然后更多输出数据帧。

还有(在我看来)搜索 DataFrame 的好方法,即使它非常稀疏。您可以检查一行的非空值:

df.loc[index_name].dropna()

或者对于索引号:

df.iloc[index_number].dropna()

您可以进一步存储这些值,例如在字典中(这是 的字典Series,但可以转换为DataFrame

row_dict = {row : df.loc[row].dropna() for row in df.index}

我可以想象一些基于这些选项的场景对搜索更有帮助。但是链接的答案很巧妙,我会尝试这样做。


编辑:根据 OP 的评论扩展上述答案。

在链接帖子中创建的字典包含 DataFrames基本上,您可以使用此字典与原始源数据进行比较。我对这个答案的唯一问题是,如果列名很乱(就像在您的数据中一样),可能很难搜索字典,所以这里有一个小小的修改:

for i, (name,df) in enumerate(df.groupby(df.isnull().dot(df.columns))):
    d['df' + str(i)] = df.dropna(1)

现在字典键是“df#”,值是数据帧。所以如果你想检查一个 DataFrame 的内容,你可以调用:

d['df1'].head()

#OR

print(d['df0'])

如果你想查看所有的 DataFrames,你可以调用

for df in d.values():
    print(df.head()) #you can also pass an integer to head to show more rows than 5

或者,如果您想保存每个 DataFrame,您可以调用:

for name in sorted(d.keys()):
   d[name].to_csv('path/to/file/' + name + '.csv')

关键是,您已经获得了一个数据结构,您可以在其中查看原始数据,将其分成多个 DataFrame,而不会丢失数据。将这些重新加入单个 DataFrame 将是多余的,因为它会创建单个 DataFrame(等于原始数据)或多个具有一定数量缺失数据的数据帧。

我认为这归结为您正在寻找什么以及您需要如何搜索数据。例如,您可以根据内部机器的类型重命名字典键/输出 .CSV 文件。

我认为您的最后一条评论可能意味着类似类型的对象可能不会共享相同的列;例如,如果并非所有“排气扇”都具有相同的列,则它们最终会出现在字典中的不同 DataFrame 中。在这种情况下,只查看单个行可能更容易,而不是将它们分组到奇怪的类别中:

df_dict = {row : pd.DataFrame(df.loc[row].dropna()).transpose() for row in df.index}

然后您可以再次将这些 DataFrame 保存为 CSV 文件或一个一个查看它们(或者例如通过查看是否"Exhaust"在它们的键中来搜索 Exhaust Fans )。你也可以一次打印它们:

import pandas as pd
import numpy as np
import natsort

#making some randomly sparse data
columns = ['Column ' + str(i+1) for i in range(10)]
index = ['Row ' + str(i+1) for i in range(100)]
df = pd.DataFrame(np.random.rand(100,10), columns=columns,index=index)
df[df<.7] = np.nan

#creating the dictionary where each key is a row name
df_dict = {row : pd.DataFrame(df.loc[row].dropna()).transpose() for row in df.index}

#printing all the output
for key in natsort.natsorted(df_dict.keys())[:5]:      #using [:5] to limit output
    print(df_dict[key], '\n')

Out[1]:
       Column 1  Column 4  Column 7  Column 9  Column 10
Row 1  0.790282  0.710857  0.949141   0.82537   0.998411 

       Column 5  Column 8  Column 10
Row 2  0.941822  0.722561   0.796324 

       Column 2  Column 4  Column 5  Column 6
Row 3    0.8187  0.894869  0.997043  0.987833 

       Column 1  Column 7
Row 4  0.832628    0.8349 

       Column 1  Column 4  Column 6
Row 5  0.863212  0.811487  0.924363 

您可以将输出写入文本文件,而不是打印;也许这是您可以查看(和搜索)以与输入表进行比较的文档类型。但请注意,即使打印的数据是表格形式,也不能在不接受没有所有列条目的行将丢失数据的情况下将它们制作成 DataFrame

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何按列值对熊猫数据框的行进行分组?

如何按季度对数据框中的行进行分组?

如何按多列对CSV行进行分组

SQL 对列中具有相同数据的行进行分组

带有SignalR数据的angularJS如何对表行进行分组

如何按频率对行进行分组?

按列值对行进行分组,并在分组时以不同方式处理某些行

(Python)如何按第一列而不是按顺序对行进行分组?

如何从行到列按数据分组

当数据的行数多于替换时,如何替换按特定条件分组的所有数据行?

如何按两列组合键的任一排列对行进行分组

在R中,按拥有客队和主队的运动数据进行分组-常见的挫败感

R:如何按二进制类别对数据帧行进行分组?

按条件对行进行分组

按索引对数据框行进行分组

如何按共享列值对CSV行进行分组和求和?

在Apache Spark中,如何按两个共享值对RDD的所有行进行分组?

按列的无序组合对 tibble 行进行分组

使用分组依据按2列对行进行计数

Pandas:按相似的列值对行进行分组

MySQL:按列值前缀对行进行分组

我在散点图中发现了意外的行,如何提取行附近的所有数据以进行进一步分析?

如何使用R为没有数据点的列插入占位符?

使用分组依据按日期对所有数据进行排序

遍历对象数组以按日期对所有数据进行分组

Pandas:如何按不同条件对多行进行分组

PostgreSQL:如何按“附近”时间戳对行进行分组

如何按任意顺序按列对行进行排序?MySQL数据库

如何按多层行对python数据框进行分组?