简体   繁体   English

从单个列值 pandas 创建 Max 和 Min 列值

[英]Create Max and Min column values from a single column value pandas

I have a dataframe like the one below and I need to create two columns out of the base column.我有一个 dataframe 如下所示,我需要从基列中创建两列。

Input输入

Kg
0.5
0.5
1
1
1
2
2
5
5
5

Expected Output预计 Output

Kg_From  Kg_To
0      0.5
0      0.5
0.5    1
0.5    1
0.5    1
1      2
1      2
2      5
2      5
2      5

How can this be done in pandas?如何在 pandas 中做到这一点?

Code:代码:

kgs = df.Kg.unique()

lower = [0] + list(kgs[:-1])
kg_dict = {k:v for v,k in zip(lower,kgs)}

# new dataframe
new_df = pd.DataFrame({
             'Kg_From': df['Kg'].map(kg_dict),
             'Kg_To': df['Kg']
         })

# or if you want new columns:
df['Kg_from'] = df['Kg'].map(kg_dict)

Output: Output:

   Kg_From  Kg_To
0      0.0    0.5
1      0.0    0.5
2      0.5    1.0
3      0.5    1.0
4      0.5    1.0
5      1.0    2.0
6      1.0    2.0
7      2.0    5.0
8      2.0    5.0
9      2.0    5.0

Assuming your kg column is sorted:假设您的kg列已排序:

s = df["Kg"].unique()
df["Kg_from"] = df["Kg"].map({k:v for k,v in zip(s[1:], s)}).fillna(0)
print (df)

    Kg  Kg_from
0  0.5      0.0
1  0.5      0.0
2  1.0      0.5
3  1.0      0.5
4  1.0      0.5
5  2.0      1.0
6  2.0      1.0
7  5.0      2.0
8  5.0      2.0
9  5.0      2.0
#get unique values and counts of each value in the Kg column
val,counts = np.unique(df.Kg,return_counts=True)

#shift forward by 1 and replace the first value with 0
val = np.roll(val,1)
val[0] = 0

#repeat the count of each value with the counts generated earlier
df['Kg_from'] = np.repeat(val,counts)

df

     Kg Kg_from
0   0.5 0.0
1   0.5 0.0
2   1.0 0.5
3   1.0 0.5
4   1.0 0.5
5   2.0 1.0
6   2.0 1.0
7   5.0 2.0
8   5.0 2.0
9   5.0 2.0

Use zip and dict for mapping new column created by DataFrame.insert with unique sorted values by np.unique with added first 0 value by np.insert :使用zipdict映射由np.insert创建的新列,由DataFrame.insert添加唯一的排序值,并由np.unique添加第一个0值:

df = df.rename(columns={'Kg':'Kg_To'})
a = np.unique(df["Kg_To"])
df.insert(0, 'Kg_from', df['Kg_To'].map(dict(zip(a, np.insert(a, 0, 0)))))
print (df)
   Kg_from  Kg_To
0      0.0    0.5
1      0.0    0.5
2      0.5    1.0
3      0.5    1.0
4      0.5    1.0
5      1.0    2.0
6      1.0    2.0
7      2.0    5.0
8      2.0    5.0
9      2.0    5.0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM