Python 基于另一列追加DataFrame列

Python 基于另一列追加DataFrame列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看起来像这样的数据框: | Index | Value | |-------|--------------| | 1 | [1, 12, 123] | | 2 | [12, 123, 1] | | 3 | [123, 12, 1] | dataframe["Expected_value"] = dataframe.value.map(lambda x: len(str(x))) 我想在第三列后面加上数组元素长度的列表: | Index | Val

我有一个看起来像这样的数据框:

| Index | Value        |
|-------|--------------|
| 1     | [1, 12, 123] |
| 2     | [12, 123, 1] |
| 3     | [123, 12, 1] |
dataframe["Expected_value"] = dataframe.value.map(lambda x: len(str(x)))
我想在第三列后面加上数组元素长度的列表:

| Index | Value        | Expected_value |
|-------|--------------|----------------|
| 1     | [1, 12, 123] | [1, 2, 3]      |
| 2     | [12, 123, 1] | [2, 3, 1]      |
| 3     | [123, 12, 1] | [3, 2, 1]      |
| Index | Value        | Expected_value |
|-------|--------------|----------------|
| 1     | [1, 12, 123] | 6              |
| 2     | [12, 123, 1] | 6              |
| 3     | [123, 12, 1] | 6              |
我尝试过使用python lambda函数和映射,如下所示:

| Index | Value        |
|-------|--------------|
| 1     | [1, 12, 123] |
| 2     | [12, 123, 1] |
| 3     | [123, 12, 1] |
dataframe["Expected_value"] = dataframe.value.map(lambda x: len(str(x)))
但我得到的不是列表,而是这些长度的总和:

| Index | Value        | Expected_value |
|-------|--------------|----------------|
| 1     | [1, 12, 123] | [1, 2, 3]      |
| 2     | [12, 123, 1] | [2, 3, 1]      |
| 3     | [123, 12, 1] | [3, 2, 1]      |
| Index | Value        | Expected_value |
|-------|--------------|----------------|
| 1     | [1, 12, 123] | 6              |
| 2     | [12, 123, 1] | 6              |
| 3     | [123, 12, 1] | 6              |

您可以将
列表理解
映射
一起使用:

dataframe["Expected_value"] = dataframe.Value.map(lambda x: [len(str(y)) for y in x])
或嵌套列表理解:

dataframe["Expected_value"] = [[len(str(y)) for y in x] for x in dataframe.Value]
[[len(str(y)) for y in x] for x in df['Value'].tolist()]
# [[1, 2, 3], [2, 3, 1], [3, 2, 1]]

df['Expected_value'] = [[len(str(y)) for y in x] for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
对于获取整数长度,也可以使用其他方法:

import math
dataframe["Expected_value"] = [[int(math.log10(y))+1 for y in x] for x in dataframe.Value]


您可以将
列表理解
映射
一起使用:

dataframe["Expected_value"] = dataframe.Value.map(lambda x: [len(str(y)) for y in x])
或嵌套列表理解:

dataframe["Expected_value"] = [[len(str(y)) for y in x] for x in dataframe.Value]
[[len(str(y)) for y in x] for x in df['Value'].tolist()]
# [[1, 2, 3], [2, 3, 1], [3, 2, 1]]

df['Expected_value'] = [[len(str(y)) for y in x] for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
对于获取整数长度,也可以使用其他方法:

import math
dataframe["Expected_value"] = [[int(math.log10(y))+1 for y in x] for x in dataframe.Value]


使用列表理解:

dataframe["Expected_value"] = [[len(str(y)) for y in x] for x in dataframe.Value]
[[len(str(y)) for y in x] for x in df['Value'].tolist()]
# [[1, 2, 3], [2, 3, 1], [3, 2, 1]]

df['Expected_value'] = [[len(str(y)) for y in x] for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
如果您需要处理丢失的数据

def foo(x):
    try:
       return [len(str(y)) for y in x]
    except TypeError:
        return np.nan

df['Expected_value'] = [foo(x) for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
在处理对象类型数据时,它可能是性能最好的。更多阅读


另一个带有
pd.DataFrame
applymap
agg
的解决方案:

pd.DataFrame(df['Value'].tolist()).astype(str).applymap(len).agg(list, axis=1)

0    [1, 2, 3]
1    [2, 3, 1]
2    [3, 2, 1]
dtype: object

使用列表理解:

dataframe["Expected_value"] = [[len(str(y)) for y in x] for x in dataframe.Value]
[[len(str(y)) for y in x] for x in df['Value'].tolist()]
# [[1, 2, 3], [2, 3, 1], [3, 2, 1]]

df['Expected_value'] = [[len(str(y)) for y in x] for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
如果您需要处理丢失的数据

def foo(x):
    try:
       return [len(str(y)) for y in x]
    except TypeError:
        return np.nan

df['Expected_value'] = [foo(x) for x in df['Value'].tolist()]
df

   Index         Value Expected_value
0      1  [1, 12, 123]      [1, 2, 3]
1      2  [12, 123, 1]      [2, 3, 1]
2      3  [123, 12, 1]      [3, 2, 1]
在处理对象类型数据时,它可能是性能最好的。更多阅读


另一个带有
pd.DataFrame
applymap
agg
的解决方案:

pd.DataFrame(df['Value'].tolist()).astype(str).applymap(len).agg(list, axis=1)

0    [1, 2, 3]
1    [2, 3, 1]
2    [3, 2, 1]
dtype: object

是我还是
Expected value
中的
6
不正确?我的脑子里乱七八糟地想我是怎么得到整数的——我没有检查这是长度值的总和,还是仅仅是值列中的列表长度。你手动插入值,我以为是准确的
map
outputIt的我,或者
期望值中的
6
不正确?我的脑子里乱七八糟地想我是怎么得到整数的——我没有检查这是长度值的总和,还是仅仅是值列中列表的长度。你手动插入值,我以为是精确的
map
输出。你能建议我如何像这样读取剪贴板吗
sep='\\;+'
不工作。@residentsleep-不幸的是,我必须复制到文本文件并更改格式,这不是很好的方法…你能建议我如何像这样阅读剪贴板吗
sep='\\;+'
不起作用。@residentsleep-不幸的是,我必须复制到文本文件并更改格式,这不是很好的方法…就像捕获
NaN
的函数一样!谢谢@Erfan!我责怪我的mac电脑自动纠错。“groupby”过去也被改成“groupie”,在我学会如何修复它之前,它非常令人恼火。不客气。是的,我可以想象,有同样的问题,比如函数捕捉
NaN
!谢谢@Erfan!我责怪我的mac电脑自动纠错。“groupby”过去也被改成“groupie”,在我学会如何修复它之前,它非常令人恼火。不客气。是的,我可以想象,我也有同样的问题