这是一个非常酷的答案,可能是一种选择 - 它确实使用了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] 删除。
我来说两句