英文:
Too many values to unpack - Pandas DataFrame
问题
I have a dataframe that I want to apply a function that takes one value and will give two values as a result. I used .apply(get_data).transpose().values
to put the results into the dataframe. It worked when I had only two rows in the dataframe but didn't work with more than two rows. I got the "Too many values to unpack (expected 2)" error.
oil_df = pd.DataFrame({
"Oils":["Oil 1","Oil 2","Oil 3"],
"Price":["","",""],
"Unit":["","",""]})
def get_data(oil):
if oil == "Oil 1":
price = 20
unit = 50
if oil == "Oil 2":
price = 30
unit = 75
if oil == "Oil 3":
price = 40
unit = 100
return(price, unit)
oil_df["Price"], oil_df["Unit"] = oil_df["Oils"].apply(get_data).transpose().values
At first, I couldn't find a way to apply the function, so I divided the function into two pieces and applied them one by one, but it took much longer than expected. I found this way with the help of this answer. axis=1, result_type='expand'
is giving me "get_data() got an unexpected keyword argument 'axis'" error, so I removed that part. I'm open to any suggestions to make this work or another way to apply this function to the dataframe. Thank you!
英文:
I have a dataframe that I want to apply a function that take one value and will give two values as a result. I used .apply(get_data).transpose().values
to put the results to the dataframe. It worked when I had only two rows in the dataframe but didn't worked with more than two rows.
I got the "Too many values to unpack (expected 2)" error.
oil_df = pd.DataFrame({
"Oils":["Oil 1","Oil 2","Oil 3"],
"Price":["","",""],
"Unit":["","",""]})
def get_data(oil):
if oil == "Oil 1":
price = 20
unit = 50
if oil == "Oil 2":
price = 30
unit = 75
if oil == "Oil 3":
price = 40
unit = 100
return(price, unit)
oil_df["Price"], oil_df["Unit"] = oil_df["Oils"].apply(get_data).transpose().values
At first, I couldn't find a way to apply the function, so I divided the function to two pieces and applied them one by one, but it took so much longer as expected. I found this way with the help of this answer. axis=1, result_type='expand
is giving me "get_data() got an unexpected keyword argument 'axis'" error, so removed that part.
I'm open to any suggestions to make this work or another way to apply this function to the dataframe. Thank you!
答案1
得分: 0
尝试使用 loc
或 np.select
for column, values in [('Price', [20, 30, 40]), ('Unit', [50, 75, 100])]:
# loc
# oil_df.loc[oil_df['Oils'].isin(['Oil 1', 'Oil 2', 'Oil 3']), column] = values
# np.select
oil_df[column] = np.select(condlist=[oil_df['Oils'] == f'Oil {i}' for i in range(1, 4)], choicelist=values)
输出
Oils Price Unit
0 Oil 1 20 50
1 Oil 2 30 75
2 Oil 3 40 100
英文:
Try loc
or np.select
for column, values in [('Price', [20, 30, 40]), ('Unit', [50, 75, 100])]:
# loc
# oil_df.loc[oil_df['Oils'].isin(['Oil 1', 'Oil 2', 'Oil 3']), column] = values
# np.select
oil_df[column] = np.select(condlist=[oil_df['Oils'] == f'Oil {i}' for i in range(1, 4)], choicelist=values)
output
Oils Price Unit
0 Oil 1 20 50
1 Oil 2 30 75
2 Oil 3 40 100
答案2
得分: 0
Here's the translated code:
不确定您真正想要实现什么,但您正在对数据进行转置,因此返回的数组有3个元组(用于oil1、2和3),所以有太多值要解包。
如果您的意图是填充第二和第三列,那么您需要返回一个具有2列的数据框(即每行一个系列),然后将其用作数据框的2列的输入。
```python
import pandas as pd
oil_df = pd.DataFrame({
"Oils":["Oil 1","Oil 2","Oil 3"],
"Price":["","",""],
"Unit":["","",""]})
def get_data(oil):
if oil == "Oil 1":
price = 20
unit = 50
if oil == "Oil 2":
price = 30
unit = 75
if oil == "Oil 3":
price = 40
unit = 100
return pd.Series([price, unit])
oil_df[['Price', 'Unit']] = oil_df["Oils"].apply(get_data)
oil_df
返回
Oils Price Unit
0 Oil 1 20 50
1 Oil 2 30 75
2 Oil 3 40 100
在这种情况下
oil_df["Oils"].apply(get_data)
返回
0 1
0 20 50
1 30 75
2 40 100
并将其分配给 oil_df[['Price', 'Unit']]
合并了数据
<details>
<summary>英文:</summary>
Not sure what you are really trying to achieve with this, but you are transposing the data, so the array you return has 3 tuples (for oil1, 2, and 3) so it has too many values to unpack.
If your intent is to fill in the second and third column, then you want to return a dataframe with 2 columns (i.e, a Series per row), and then use it as input to the dataframe's 2 columns
import pandas as pd
oil_df = pd.DataFrame({
"Oils":["Oil 1","Oil 2","Oil 3"],
"Price":["","",""],
"Unit":["","",""]})
def get_data(oil):
if oil == "Oil 1":
price = 20
unit = 50
if oil == "Oil 2":
price = 30
unit = 75
if oil == "Oil 3":
price = 40
unit = 100
return pd.Series([price, unit])
oil_df[['Price', 'Unit']] = oil_df["Oils"].apply(get_data)
oil_df
returns
Oils Price Unit
0 Oil 1 20 50
1 Oil 2 30 75
2 Oil 3 40 100
in this case
```python
oil_df["Oils"].apply(get_data)
returns
0 1
0 20 50
1 30 75
2 40 100
and assigning this to oil_df[['Price', 'Unit']]
merges the data
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论