【问题标题】:How do I change multiple pandas Dataframes at once using for loop如何使用for循环一次更改多个熊猫数据框
【发布时间】:2018-11-29 01:26:41
【问题描述】:

我有两个结构几乎相同的 DataFrame,我想同时对它们执行数据转换/清理。为此,我创建了一个包含这两个 DF 的列表并循环遍历该列表。

例如:

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
combined = [train, test]
for dataset in combined:
    dataset = dataset.drop(['Age'], axis =1)
    print(dataset.head())

for 循环中的最终打印语句工作正常——“年龄”列被删除。但是,如果我立即调用 train.head(),则删除的列仍然存在于 DataFrame 中。就好像正在创建“train”和“test”的两个副本——“combined”列表中的副本和外部的副本。我需要做些什么来使这些更改持续存在吗?

这似乎应该如此简单,这让我发疯了!

【问题讨论】:

    标签: python pandas dataframe for-loop


    【解决方案1】:

    您在每个循环中创建一个新的数据集变量,并在这些变量上执行操作。因此,正如您所说,您确实在创建训练和测试的副本。你想要的是drop那个列inplace,而不是重新分配:

    train = pd.read_csv('train.csv')
    test = pd.read_csv('test.csv')
    combined = [train, test]
    for dataset in combined:
        dataset.drop(['Age'], axis = 1, inplace=True)
        # print(dataset.head())
    

    请注意,另一种解决方案是在您 load them 时忽略这些列:

    train = pd.read_csv('train.csv', usecols=lambda x: x!='Age')
    test = pd.read_csv('test.csv', usecols=lambda x: x!='Age')
    

    【讨论】:

    • 效果很好,谢谢!你知道为什么我的转型没有奏效吗?我很惊讶这两种表达方式都不相同。至于在导入时省略列——我使用它们的值作为计算不同字段的一部分,但不想用多余的文本混淆问题。感谢您提供示例!
    • 因为当您说dataset = dataset.drop(...) 时,它正在创建一个 数据框,您将在该数据框上应用drop。原始数据框未以任何方式修改。
    • 哦,所以我在想那个场景中的“数据集”是“train”和“test”的占位符,其中的表达式是 train = train.drop(...) 和 `test = test.drop( ...)'。这是否意味着我上面的表达式创建了一个 third 数据框名称“dataset”?
    • 是的,循环完成后,它将具有来自combined 中的last 数据帧的值。这将是唯一一个实际删除了 Age 的数据集。
    • 有趣...所以如果我的函数没有可用的inplace 参数,是否不可能以这种方式循环数据帧?我想到的一个例子可能是:for dataset in [train,test]: dataset['Sex'] = dataset['Sex'].map({'male':0, 'female':1}).astype(int)
    【解决方案2】:

    除了@sacul 的回答之外,还有更常见的方法来修改列表中的值,如下所示:

    lst = [1,2,3,4] # any list
    for i, elem in enumerate(lst):
        lst[i] = elem + 1 # can be any method here
    lst
    Out[24]: [2, 3, 4, 5]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2015-09-19
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多