根据dataframe python中的值分配值

时间:2018-02-02 10:04:26

标签: python pandas dataframe

我有一个数据帧df1:

df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan}) 

enter image description here

如果在DF_1A中是数字(同一行),我必须为DF_3B分配值 我有A以上然后值是100而B是200。 毕竟这个表应该是这样的:

enter image description here

编辑: 所以我试着以另一种方式解释它。 循环通过DF_1A列。让该循环的每个元素都是x。然后:
- 如果x是一个字母什么都不做 - 如果x是数值,则有两种可能性        a)如果x之上的一行的值是字母,则在同一行中的DF_3B栏中指定字母(100或200)的等效值,其中x为 b)如果x之上的一行的值是数字,则在同一行中的DF_3B列中的一行上分配值DF_3B,其中x是

或许还有另一种更简单的方法?

谢谢你, 亚雷克

2 个答案:

答案 0 :(得分:1)

不是最佳解决方案,但这可行:

d1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan})

d1['temp'] = np.where(d1['DF_1A'].shift(1)=='A',1,2)

d1['DF_3B'] = np.where(d1['DF_1A'].str.isdigit(),100,np.nan)*d1['temp']

d1.drop('temp',axis=1, inplace=True)

d1.head()

答案 1 :(得分:1)

解决问题的另一种方法。您没有指定存储替换值的方式,所以我假设了一个字典:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5, 6, "A", 8, 9, 10], 'DF_1B' : [10, 25, 40, 10, 15, 12, 1, 3.7, 5, -2], 'DF_3B' : np.nan})

#transcription dictionary
transcr = {"A": 100, "B": 200}
#transfer values from row DF_1A to DF_3B, if they are in the dictionary
df1["DF_3B"] = df1.loc[df1["DF_1A"].isin(transcr), "DF_1A"]
#forward filling and substition of letters with values
df1["DF_3B"] = df1["DF_3B"].fillna(method='ffill').replace(transcr)
#resetting rows that contain letters to NaN
df1.loc[df1["DF_1A"].isin(transcr), "DF_3B"] = np.nan

print(df1)

输出

  DF_1A  DF_1B  DF_3B
0     A   10.0    NaN
1     2   25.0  100.0
2     B   40.0    NaN
3     4   10.0  200.0
4     5   15.0  200.0
5     6   12.0  200.0
6     A    1.0    NaN
7     8    3.7  100.0
8     9    5.0  100.0
9    10   -2.0  100.0