【问题标题】:How to get values of one column based on another column using specific match values如何使用特定匹配值基于另一列获取一列的值
【发布时间】:2019-11-24 11:26:10
【问题描述】:

我有 5 列包含 [电压、总线、负载、负载值、传输、传输值]。所有带有 Values 的列名都包含基于其对应值的数值。csv 文件如下所示

Voltage     Bus    Load   load_Values   transmission    transmission_Values
Voltage(1)  2      load(1)   3          transmission(1)      2
Voltage(2)  2      load(2)   4          transmission(2)      3
Voltage(5)  3      load(3)   5          transmission(3)       5

我必须根据传输和负载来获取总线的值。例如 获得总线的价值。首先,我需要获取传输(2)的值,即 3。现在基于此值,我需要获取负载的值,即 load(3)=5。接下来,基于此值,我必须得到 Voltage(5) 的值为 3。

我尝试根据其对应的列值获取单个列的值。

total=df[df['load']=='load(1)']['load_Values']
next_total= df[df['transmission']=='transmission['total']']['transmission_Values']
v_total= df[df['Voltage']=='Voltage(5)']['Voltage_Values']

如何自动获取所有这些值。例如,如果我在每列中有 1100 个值,我如何获取这些列中 1100 的所有值。

This is how dataset looks like 所以要获得 VRES_LD 的值,这是新列。为此,我必须查找具有值 I__ND_LD(1) 的 I__ND_LD 列和存储在 I__ND_LD_Values 中的对应值,即 10。一旦我得到值 10,现在基于该值,我必须查找具有 I__BS__ND(10) 的 I__BS_ND 列在 I__BS_ND_Values 中其值为 5.0。基于这个值,我必须找到 V_BS(5) 的值,即 0.986009。现在该值应存储在新列 VRES_LD 中。如果你现在得到它,请告诉我。

【问题讨论】:

  • 现在就来看看吧!我已更改列的名称

标签: python-3.x pandas numpy dataframe


【解决方案1】:

我概括了您的解决方案,以便您可以使用任意数量的值。

我将名称“Load_Value”更改为“load_value_name”以避免混淆,因为有一个名为“load_value”的小写变量。

您可以从任意数量的值开始;在我们的示例中,我们从“1”开始:

start_values = [1]
load_value_name = [f"^I__ND_LD({n})" for n in start_values]
#Output: but you'll have more than one if needed
['^I__ND_LD(1)']

然后我们获取所有的值:

load_values=df[df['I__ND_LD'].isin(load_names)]['I__ND_LD_Values'].values.astype(np.int)
#output: again, more if needed
array([10])

让我们获取巴士名称:

bus_names = [f"^I__BS_ND({n})" for n in load_values]
bus_values = df[df['I__BS_ND'].isin(bus_names)]['I__BS_ND_Values'].values.astype(np.int)
#output
array([5])

最后是电压:

voltage_bus_value = [f"^V_BS({n})" for n in bus_values]
voltage_values = df[df['V_BS'].isin(voltage_names)]['V_BS_Values'].values
#output
array([0.98974069])

注意事项: 我没有四舍五入,而是向下转换为 int;并且 .isin() 方法会查找所有出现的情况,因此您可以获取所有值。

【讨论】:

  • 我有一个问题,而不是写 load_names,bus_names,voltage_names 我应该写什么,因为它显示这些未定义的错误。为了存储电压值,我需要定义数组来存储所有值。其次,如果我需要自动滚动列的所有值,可以说它将计算索引值为 1100 的值,然后自动执行 1100 值。非常感谢楼主
  • 好吧,它们已经定义好了。所以你要么用不同的方式拼写(注意最后有一个“s”),要么我只是在这个页面上拼错了它们。或者,如果您使用的是笔记本,则需要重新运行定义变量的单元格。
  • 好吧,要存储您需要指定索引或索引范围的值。首先定义列: df["column_for_storage"] = np.nan 然后像这样存储 my_array df[:len(my_array),"column_for_storage"]=my_array
  • 'df['VRES_LD']=np.nan df[:len(voltage_values),"VRES_LD"]=voltage_values' 我得到上述错误“值的长度与索引的长度不匹配” .先生,还有一个问题,如果我需要计算 11000 个列值,我该怎么做,因为每次 start_values=1。
  • 是的,抱歉,您需要使用 iloc,因此将以下内容替换为:df[:len(voltage_values),"VRES_LD"]=voltage_values:df.iloc[:len(voltage_values),df。 columns=="VRES_LD"]=电压值
【解决方案2】:

如果我理解正确,您应该能够创建键/值表并使用mergevoltage 的步骤有点不清楚,但我认为下面的基本想法应该可行:

df = pd.DataFrame({'voltage': {0: 'Voltage(1)', 1: 'Voltage(2)', 2: 'Voltage(5)'},
 'bus': {0: 2, 1: 2, 2: 3},
 'load': {0: 'load(1)', 1: 'load(2)', 2: 'load(3)'},
 'load_values': {0: 3, 1: 4, 2: 5},
 'transmission': {0: 'transmission(1)',
  1: 'transmission(2)',
  2: 'transmission(3)'},
 'transmission_values': {0: 2, 1: 3, 2: 5}})

load = df[['load', 'load_values']].copy()
trans = df[['transmission','transmission_values']].copy()
load['load'] = load['load'].str.extract('(\d)').astype(int)
trans['transmission'] = trans['transmission'].str.extract('(\d)').astype(int)

(df[['bus']].merge(trans, how='left', left_on='bus', right_on='transmission')
            .merge(load, how='left', left_on='transmission_values', right_on='load'))

导致:

   bus  transmission  transmission_values  load  load_values
0    2             2                    3   3.0          5.0
1    2             2                    3   3.0          5.0
2    3             3                    5   NaN          NaN

【讨论】:

  • 我们每列都有数千个值,每个列名都是唯一的,具有不同的值,我必须根据传输名称和负载名称及其值来获取电压的特定值。我在获取带有名称的列的特定值时遇到问题。例如。我将如何编写传输(2)的条件以获得值 3,下一次可能我必须获取传输(1100)的值,该值具有一定的价值。如果你明白,请告诉我
【解决方案3】:

我认为你需要做 3 件事。

1.您需要在字符串中输入一个数字。你这样做:

n_cookies = 3
f"I want {n_cookies} cookies"
#Output
I want 3 cookies

2.假设您需要获取的值是:

transmission_values = [2,5,20]
You than need to fetch those load values:
load_values_to_fetch = [f"transmission({n})" for n in transmission_values]
#output
[transmission(2),transmission(5),transmission(20)]

3.从df中获取所有电压值。使用 .isin() 方法:

voltage_value= df[df['Voltage'].isin(load_values_to_fetch )]['Voltage_Values'].values

我希望我正确理解了这个问题。尝试让我们知道,因为我无法尝试没有数据的代码

【讨论】:

  • [这就是数据集的样子][1] [1]:i.stack.imgur.com/wWvVq.png 所以要获得 VRES_LD 的值,它是新列。为此,我必须查找具有值 I__ND_LD(1) 的 I__ND_LD 列和存储在 I__ND_LD_Values 中的对应值,即 10。一旦我得到值 10,现在基于该值,我必须查找具有 I__BS__ND(10) 的 I__BS_ND 列在 I__BS_ND_Values 中其值为 5.0。基于这个值,我必须找到 V_BS(5) 的值,即 0.986009。这些值应存储在新列 VRES_LD 中。如果你现在得到它,请告诉我。
  • 我认为你的例子很清楚。我只是没有数据来尝试我的解决方案。明天我会看看你的链接,因为我所在的时区已经晚了。
  • 当然!不用担心,如果您愿意,我也可以向您发送示例数据集
  • 好的,发送。这样更容易
  • 你有机会看看吗
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2021-06-10
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多