首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >导致“`PerformanceWarning: DataFrame是高度零碎”的列太多

导致“`PerformanceWarning: DataFrame是高度零碎”的列太多
EN

Stack Overflow用户
提问于 2022-01-28 00:05:43
回答 1查看 677关注 0票数 0

我在dataframe的第一列中有一个文件列表。我的目标是创建第二列,它代表文件类别,类别反映文件路径中的单词。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

data = {'filepath':  ['C:/barracuda/document.doc', 'C:/dog/document.doc', 'C:/cat/document.doc']
        }

df = pd.DataFrame(data)

df["Animal"] =(df['filepath'].str.contains("dog|cat",case=False,regex=True))

df["Fish"] =(df['filepath'].str.contains("barracuda",case=False))

df = df.loc[:, 'filepath':'Fish'].replace(True, pd.Series(df.columns, df.columns))

df = df.loc[:, 'filepath':'Fish'].replace(False,np.nan)

def squeeze_nan(x):
    original_columns = x.index.tolist()
    squeezed = x.dropna()
    squeezed.index = [original_columns[n] for n in range(squeezed.count())]

    return squeezed.reindex(original_columns, fill_value=np.nan)

df = df.apply(squeeze_nan, axis=1) 
print(df)

这个密码起作用了。当我有200个以df['columnName'] =开头的语句时,问题就出现了。因为我有这么多,我就会犯错误:

PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling frame.insert many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use newframe = frame.copy()

为了解决这个问题,我尝试过:

代码语言:javascript
运行
复制
dfAnimal = df.copy

dfAnimal['Animal'] = dfAnimal['filepath'].str.contains("dog|cat",case=False,regex=True)

dfFish = df.copy
dfFish["Fish"] =dfFish['filepath'].str.contains("barracuda",case=False)

df = pd.concat(dfAnimal,dfFish)

上面的内容给了我一些错误,比如method object is not iterablemethod object is not subscriptable。然后,我尝试了df = df.loc[df['filepath'].isin(['cat','dog'])],但只有在“猫”或“狗”是专栏中唯一的单词时,这才有效。如何避免性能错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-28 00:21:10

尝试在dict中创建所有新列,然后将该dict转换为dataframe,然后使用pd.concat将结果数据dict(包含新列)添加到原始数据dict中:

代码语言:javascript
运行
复制
new_columns = {
    'Animal': df['filepath'].str.contains("dog|cat",case=False,regex=True),
    'Fish': df['filepath'].str.contains("barracuda",case=False),
}

new_df = pd.DataFrame(new_columns)
df = pd.concat([df, new_df], axis=1)

添加到原始代码中,如下所示:

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

data = {'filepath':  ['C:/barracuda/document.doc', 'C:/dog/document.doc', 'C:/cat/document.doc']
        }

df = pd.DataFrame(data)


##### These are the new lines #####

new_columns = {
    'Animal': df['filepath'].str.contains("dog|cat",case=False,regex=True),
    'Fish': df['filepath'].str.contains("barracuda",case=False),
}
new_df = pd.DataFrame(new_columns)
df = pd.concat([df, new_df], axis=1)

##### End of new lines #####

df = df.loc[:, 'filepath':'Fish'].replace(True, pd.Series(df.columns, df.columns))

df = df.loc[:, 'filepath':'Fish'].replace(False,np.nan)

def squeeze_nan(x):
    original_columns = x.index.tolist()
    squeezed = x.dropna()
    squeezed.index = [original_columns[n] for n in range(squeezed.count())]

    return squeezed.reindex(original_columns, fill_value=np.nan)

df = df.apply(squeeze_nan, axis=1) 
print(df)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70887392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档