【问题标题】:Why does df.index silently fail when used as a mask in .loc?为什么 df.index 在 .loc 中用作掩码时会静默失败?
【发布时间】:2018-02-26 04:54:10
【问题描述】:

我正在尝试使用来自另一个 df (send_df) 的一些列在一个 df (receiver_df) 中设置一些值。

使用:

receiver_df.loc[send_df.index, stat_clmns_lst] = send_df.iloc[0][stat_col_lst] 

代码静默失败send_df.index 似乎是问题所在。

此过程是循环的一部分。所以.join 不起作用。在第一次通过时,我不知道send_df 将通过的所有列。这是数据在第一次传递时的样子。

设置数据

import numpy as np
import pandas as pd
import string

from IPython.display import display

# Parameters
send_df_index = 2 # Tells send_df where to send data in receiver df
num_rows = 5

# Columns to get from send_df
send_col_lst = ['Some_Index', 'Another_Index']

# Datarame receiving data
receiver_df = pd.DataFrame({'Attempted':[False for x  in range(num_rows)],
                  'StringX':[pd.util.testing.rands(3) for x  in range(num_rows)],
                  'StringY':[pd.util.testing.rands(3) for x  in range(num_rows)]
                  })

# Dataframe sending data
send_values = random.choices(string.ascii_uppercase, k=1)
send_values.extend(np.random.uniform(low=2, high=100, size=(1,2)).tolist()[0])

send_df = pd.DataFrame([send_values], 
                        columns=['String', 'Some_Index', 'Another_Index'], 
                        index=[stats_df_index])

脚本

# Reindex - We dont know the stat columns ahead of time
new_col_lst = receiver_df.columns.values.tolist()
new_col_lst.extend(send_col_lst)
receiver_df = receiver_df.reindex(columns=new_col_lst)

# Set values to receiving df send_df[stat_col_lst]
receiver_df.loc[send_df.index, send_col_lst] = send_df.iloc[0][send_col_lst]
display(receiver_df)

不想要的结果:

期望的结果:

【问题讨论】:

  • @Zero 因为 send_df 中有一些列与 receiver_df 重叠,但我不想使用它们或合并它们。
  • @ 至于你的第二个解决方案,我试过了,但 .loc 想要一个系列
  • @ Zero 我都试过了。两种解决方案都不起作用。在第二个循环中,join 再次添加了 send_df 列。第二种解决方案的错误是ValueError:: Incompatible indexer with Series

标签: python-3.x pandas


【解决方案1】:

我不知道如何在轴 1(列)上进行串联以在迭代中工作。另一种解决方法是在axis0上迭代地附加你的“发送df”,然后在for循环之后将它加入你的接收器df

sending_df = pd.DataFrame()
for i in range(k):
    sending_df = sending_df.append(df2)

receiver_df = receiver_df.join(sending_df)

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2022-01-19
    • 2020-08-17
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多